簡體   English   中英

調試和發布庫鏈接與 CMAKE (VISUAL STUDIO)

[英]Debug and Release Library Linking with CMAKE (VISUAL STUDIO)

已經有一個線程並沒有真正幫助。 我希望能夠鏈接例如Foo.lib用於發布版配置和Foo_d.lib調試配置,我怎么能做到這一點? 如果我這樣做:

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

那么我的項目中有兩個庫用於調試配置? 為什么沒有發布選項?

非常感謝!

target_link_libraries 需要一個列表,你不需要調用它兩次。 以下將起作用:

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 會為您選擇合適的。

解決辦法是:

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

當您的庫是項目的一部分或者您使用find_package命令的配置模式導入它時,沒有問題(請參閱文檔示例)。 如果您無法修改 3rd 方,因此它將生成<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_libraryfind_package(... MODULE)等常規 cmake 命令來估計位置,而不是對其進行硬編碼。

如果您有遵循特定模式的調試/發布庫,例如調試庫上的 _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期望的行。

使用帶有調試和優化參數的 target_link_libraries 的上層答案不適用於我的 cmake 3.14.6。 如果您遇到此錯誤,請嘗試使用以下類型的代碼:

set (FreeImage debug "FreeImageD" optimized "FreeImage")
set (Glog debug "glogd" optimized "glog")
set (EXTRA_LIBS ${FreeImage} ${Glog})
target_link_libraries(TexCompressor ${EXTRA_LIBS})

它只是將調試/優化對更改為變量定義。 它適用於我的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM