web-dev-qa-db-ja.com

CMakeでリンカーフラグをオンにする

CMakeを使用してVS2010ターゲットを生成するときは、/ LTCGフラグをオンにします(可能な場合はリリース+ releasewithdebinfoの場合のみですが、デバッグビルドの場合はオンにしても問題ありません)。リンカフラグを変更するにはどうすればよいですか? add_definitions()は、コンパイラフラグを変更するだけなので、機能しません。はい、if(MSVC)でラップしました。

リンカフラグを変更するにはどうすればよいですか?

20
Clark Gaebel

MSC #pragma comment(linker、...)を使用してリンカーフラグを変更できます

ただし、cmakeを使用したビルドプロセスでこれを実行する場合は、次の名前を知っておく必要があります。

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(ありがとう Cmake.org )。

28
DMags

およびSTATIC_LIBRARY_FLAGS http://www.cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:STATIC_LIBRARY_FLAGS

静的ライブラリの場合

4
elegant dice

LINK_FLAGSプロパティを使用して、特定のターゲットのリンカーフラグを追加できます。

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

APPEND_STRINGを使用しているため、フラグの前にスペースを追加したことに注意してください)

2
kaveish

「ucm」ライブラリの使用は素晴らしいアプローチのようです。コンパイラ固有の使用を許可しながら、すべての構成のCMakeでリンカーフラグを均一に管理するのに役立つ単純なマクロを作成しました。 (変数を設定するだけで、CMakeが複数回構成されている場合にフラグがスタックする可能性があります。)

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()

他のコンパイラは、使用中のコンパイラをチェックするコンパイラ固有のマクロを作成することでサポートされます。そのため、間違ったコンパイラに正しいフラグを設定することが難しくなります。

if(CMAKE_COMPILER_IS_GNUCXX)

そして

if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
2
DiB

リンカフラグを追加する場合-次の4つのCMake変数:

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

cm_add_linker_flags マクロ cm を使用して、さまざまな構成(デバッグ、リリース...)で簡単に操作できます。

リンカフラグは、ターゲットごとに管理することもできます target_link_libraries を使用し、フラグの前に-を付けて(ただし、-lを付けずに)フラグを渡すことにより、リンクフラグではなく、リンクライブラリとして扱われます)。

1
onqtam