web-dev-qa-db-ja.com

Windows上のCmakeでデバッグおよびリリースビルド用の異なるライブラリをリンクしますか?

したがって、コンパイル中のライブラリがあり、それがデバッグまたはリリースビルド(具体的には、それらのライブラリのリリースまたはデバッグバージョン)に応じて、異なるサードパーティのものをリンクする必要があります。 Cmakeでこれを行う簡単な方法はありますか?

編集:Visual Studioを使用していることに注意してください

47
gct

CMakeドキュメント によると:

target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...)

「debug」、「optimized」、または「general」キーワードは、それに続くライブラリが対応するビルド構成にのみ使用されることを示します。

だからあなたはこれを行うことができるはずです:

add_executable( MyEXE ${SOURCES})

target_link_libraries( MyEXE debug 3PDebugLib)
target_link_libraries( MyEXE optimized 3PReleaseLib)
81
Mike Willekes

どういうわけか、@ Mike Willekesからの答えは、同じターゲットのリリースとdebugの両方でCMakeリンクを取得しました:(

@sakra 関連する質問 -で示唆されているように、両方の設定を1行で設定することでこれを機能させましたが、リンクする必要があるすべてのライブラリに対してそうします:

target_link_libraries ( app
    debug ${Boost_FILESYSTEM_LIBRARY_DEBUG}
    optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE} )

target_link_libraries ( app
    debug ${Boost_LOG_LIBRARY_DEBUG}
    optimized ${Boost_LOG_LIBRARY_RELEASE} )

target_link_libraries ( app
    debug ${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG}
    optimized ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE} )

# ...
13
Tarc

以前の回答にいくつかのメモを追加したいと思います。

リンクして複数のファイルのリストを作成してキャッシュ変数に保存する必要がある場合は、各ライブラリの前に指定されたoptimizedまたはdebugを追加する必要があります。これは、より大きなメイクファイル/プロジェクトに特に役立ちます。

たとえば、次のようなことができます。

set( MyFavLib_LIBRARIES 
    debug debug/module1.lib optimized release/module1.lib
    debug debug/module2.lib optimized release/module2.lib )
target_link_libraries( app ${MyFavLib_LIBRARIES} )
1
akaltar

私のために働いたのは、cmakeに提供されたlibパスで$(Configuration)マクロを使用することでした。

そのため、ライブラリが別々の、適切な名前のフォルダーに保存されていると仮定します、例えば:

_C:\boost\lib\Debug\libfoo.lib
C:\boost\lib\Release\libfoo.lib
_

その後、次を使用してcmakeを呼び出すことができます。

_cmake -G "Visual Studio 10 2010" -DBOOST_LIBRARYDIR=C:\boost\lib\$(Configuration)\libfoo.lib
_

C:\boost\lib\$(Configuration)\libfoo.libを含む追加の依存関係を持つ.vcxprojが生成され、選択された構成に応じて_C:\boost\lib\Release\libfoo.lib_または_C:\boost\lib\Debug\libfoo.lib_に評価されます。

0
Konrad