Die Verwendung der "ucm" -Bibliothek scheint ein netter Ansatz zu sein. Ich habe ein einfaches Makro gerollt, das mir hilft, die Linker-Flags in CMake für alle Konfigurationen einheitlich zu verwalten und gleichzeitig eine Compiler-spezifische Verwendung zuzulassen. (Just variablen Einstellung kann Flags verursachen bis stapeln, wenn sie mehrmals CMake konfiguriert ist.)
macro(ADD_MSVC_LINKER_FLAG flag)
if(MSVC)
if(${CMAKE_EXE_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
if(${CMAKE_SHARED_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
if(${CMAKE_STATIC_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
if(${CMAKE_MODULE_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
endif()
endmacro()
Andere Compilern werden dann unterstützt von einem Compiler spezifischen Makro erstellt, die Compiler Kontrollen nach Gebrauch zu sein. Das macht es schwieriger, das richtige Flag für den falschen Compiler zu setzen.
if(CMAKE_COMPILER_IS_GNUCXX)
und
if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
In den letzten CMake Versionen die einzige Fahne links ist CMAKE_EXE_LINKER_FLAGS; Am besten ist es, die Zieleigenschaften zu bearbeiten (siehe http://stackoverflow.com/questions/11783932/how-to-add-linker-or-compile-flag-in-cmake-file) – koda
ich nicht weiß warum der Kommentar oben zwei Upvotes hat. Siehe https://cmake.org/cmake/help/git-master/variable/CMAKE_SHARED_LINKER_FLAGS.html?highlight=cmake_shared_linker_flags und https://cmake.org/cmake/help/git-master/variable/CMAKE_MODULE_LINKER_FLAGS.html?highlight = cmake_module_linker_flags: Diese Flags befinden sich definitiv in den letzten CMake-Versionen. –