已经有一个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