![](/img/trans.png)
[英]Linking against library in release and .exe in debug crashes in 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_library
和find_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.