2011-03-31 83 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期望的行。