2011-03-31 118 views
16

已經有一個Thread這實際上沒有幫助。我希望能夠鏈接例如Foo.lib發佈配置和Foo_d.lib調試配置,我怎麼能做到這一點? 如果我這樣做:調試和發行庫與CMAKE(VISUAL STUDIO)鏈接

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

然後我有兩個庫在我的項目的調試配置? 爲什麼沒有發佈選項?

非常感謝!

回答

25

解決的辦法是:

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

我一直在尋找預製模塊的解決方案。例如:在FindQt4.cmake中。 – Naszta 2011-03-31 09:02:11

+1

如果我有多個調試和發佈庫,這將如何工作。例如,我有_Foo1_d _,_ Foo2_d_&_Foo1 _,_ Foo2_。我如何將他們歸入單變量?目前它只能檢測第一個關聯庫(調試或發佈)的關鍵字,並且不能識別下一個 – user1036908 2014-07-31 11:45:31

8

沒有問題,當你的庫是項目的一部分,或者你 它使用find_package命令的配置模式導入(見documentationexample)。 如果您不能修改的第三方,因此會產生<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_libraryfind_package(... MODULE)定期cmake的命令來估計位置,而不是硬編碼他們。

18

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

6

如果您有關於調試那些遵循一定的模式,像_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期望的行。

相關問題