已經有一個Thread這實際上沒有幫助。我希望能夠鏈接例如Foo.lib爲發佈配置和Foo_d.lib爲調試配置,我怎麼能做到這一點? 如果我這樣做:調試和發行庫與CMAKE(VISUAL STUDIO)鏈接
target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
然後我有兩個庫在我的項目的調試配置? 爲什麼沒有發佈選項?
非常感謝!
已經有一個Thread這實際上沒有幫助。我希望能夠鏈接例如Foo.lib爲發佈配置和Foo_d.lib爲調試配置,我怎麼能做到這一點? 如果我這樣做:調試和發行庫與CMAKE(VISUAL STUDIO)鏈接
target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
然後我有兩個庫在我的項目的調試配置? 爲什麼沒有發佈選項?
非常感謝!
解決的辦法是:
SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
沒有問題,當你的庫是項目的一部分,或者你 它使用find_package
命令的配置模式導入(見documentation和example)。 如果您不能修改的第三方,因此會產生<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)
記不像「調試」 /「優化」功能,這樣的方法並不侷限於調試/發佈CONFIGS:
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的命令來估計位置,而不是硬編碼他們。
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會爲您選擇合適的一個。
如果您有關於調試那些遵循一定的模式,像_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
期望的行。
我一直在尋找預製模塊的解決方案。例如:在FindQt4.cmake中。 – Naszta 2011-03-31 09:02:11
如果我有多個調試和發佈庫,這將如何工作。例如,我有_Foo1_d _,_ Foo2_d_&_Foo1 _,_ Foo2_。我如何將他們歸入單變量?目前它只能檢測第一個關聯庫(調試或發佈)的關鍵字,並且不能識別下一個 – user1036908 2014-07-31 11:45:31