web-dev-qa-db-ja.com

CMAKE(VISUAL STUDIO)とリンクするライブラリのデバッグとリリース

すでに スレッド がありましたが、実際には役に立ちませんでした。たとえば、Foo.libforReleaseにリンクできるようにしたいConfig andFoo_d.libforDebugConfig、どうすればこれを達成できますか?私がこれを行う場合:

target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)

次に、デバッグ構成用の両方のライブラリがプロジェクトにありますか?リリースオプションがないのはなぜですか?

どうもありがとう!

21
Gabriel

解決策は次のとおりです。

SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
24
Naszta

target_link_librariesはリストを取得するため、2回呼び出す必要はありません。以下が機能します。

target_link_libraries(MyEXE debug Foo_d optimized Foo)

また、別の回答のコメントで尋ねられた質問に回答するには、複数のライブラリでの作業は次のように機能します。

target_link_libraries(MyEXE
    debug Foo1_d optimized Foo1
    debug Foo2_d optimized Foo2)

CMakeプロジェクトの一部としてライブラリもビルドする場合は、デバッグや最適化を指定する必要がないことに注意してください。 CMakeはあなたにぴったりのものを選びます。

28
scl

ライブラリがプロジェクトの一部である場合、または_find_package_コマンドの構成モードを使用してライブラリをインポートする場合は問題ありません( ドキュメント および を参照)。サードパーティを変更できないために_<package>Config.cmake_が生成される場合(cmakeツールを使用しないか、実行したくない場合があります)、答えはそのようなプロセスをエミュレートすることです。

_add_library(foo STATIC IMPORTED)
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib")

target_link_libraries(MyEXE foo)
_

「デバッグ」/「最適化」機能とは異なり、このようなアプローチはデバッグ/リリース構成に限定されないことに注意してください。

_set_target_properties(foo PROPERTIES IMPORTED_LOCATION_MINSIZEREL "/path/to/foo-small.lib")
_

また、 INTERFACE_INCLUDE_DIRECTORIES :のようないくつかのグッズがあります。

_set_target_properties(foo PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "/path/to/foo/includes")

include_directories("/path/to/foo/includes") # this line not needed
target_link_libraries(MyEXE foo) # this command will add "/path/to/foo/includes" for you
_

および推移的なリンク:

_add_library(boo STATIC IMPORTED)
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/boo-d.lib")
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/boo.lib")

add_library(foo STATIC IMPORTED)
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib")

set_target_properties(foo PROPERTIES INTERFACE_LINK_LIBRARIES boo) # foo depends on boo

target_link_libraries(MyEXE foo) # boo will be linked automatically
_

もちろん、_find_library_やfind_package(... MODULE)などの通常のcmakeコマンドを使用して、場所をハードコーディングする代わりに推定することができます。

15
user2288008

デバッグライブラリの_dのように、特定のパターンに従うデバッグ/リリースライブラリがある場合は、次のようにして繰り返すのを避けることができます。

set (MY_LIBS
    foo
    bar
    baz
)

# Generate the list of files to link, per flavor.
set (LINK_LIST "")
foreach(x ${MY_LIBS})
    list (APPEND LINK_LIST debug ${x}_d optimized ${x})
endforeach()

target_link_libraries (mytarget
    commonlib1
    commonlib2
    ${LINK_LIST}
    )

これにより、適切な

debug foo_d optimized foo
debug bar_d optimized bar

target_link_libraries期待します。

8
Alex Budovski