2010-08-23 13 views
17

Beim Generieren von VS2010-Zielen mit CMake möchte ich das Flag/LTCG aktivieren (nur für Release + releasewithdebinfo, wenn möglich, aber in Ordnung, wenn es für Debugbuilds aktiviert ist). Wie ändere ich die Linker-Flags? add_definitions() funktioniert nicht, da das nur Compiler-Flags ändert. Und ja, ich habe es eingepackt, wenn (MSVC).Aktivieren von Linker-Flags mit CMake

Wie ändere ich die Linker-Flags?

Antwort

26

Sie können die Linker-Flags in MSC ändern Pragma Kommentar mit (Linker, ...)

jedoch, wenn Sie es in dem Build-Prozess mit cmake, hier tun mögen, sind die Namen, die Sie brauchen zu wissen:

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(Danke an Cmake.org).

+2

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

+1

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. –

0

Für Linker-Flags hinzugefügt - die folgenden 4 CMake Variablen:

CMAKE_EXE_LINKER_FLAGS 
CMAKE_MODULE_LINKER_FLAGS 
CMAKE_SHARED_LINKER_FLAGS 
CMAKE_STATIC_LINKER_FLAGS 

kann leicht für verschiedene Konfigurationen (Debug, Release manipuliert werden .. .) mit dem ucm_add_linker_flags Makro von ucm

Linker-Flags können auch pro Zielbasis verwaltet werden - indem target_link_libraries verwendet wird und Flags mit einer - vor ihnen übergeben werden (aber nicht mit einer -l - die als Link-Bibliothek und nicht als Link-Flag behandelt würde).

2

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)