已经有一个线程,但没有真正帮助。我想能够链接例如Foo.lib的Release配置,以及Foo_d.lib的Debug配置,我该怎么做?如果我这样做:
target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
那么在我的项目中,调试配置下我同时拥有这两个库?为什么没有发布选项?
非常感谢!
已经有一个线程,但没有真正帮助。我想能够链接例如Foo.lib的Release配置,以及Foo_d.lib的Debug配置,我该怎么做?如果我这样做:
target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
那么在我的项目中,调试配置下我同时拥有这两个库?为什么没有发布选项?
非常感谢!
target_link_libraries需要一个列表,你不需要调用它两次。以下代码可以正常工作:
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项目的一部分进行构建,则无需指定debug或optimized。 CMake会为您选择正确的一个。
SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
当您的库是项目的一部分或者您使用find_package
命令的配置模式导入它时(请参见文档和示例),就不会出现问题。
如果您无法修改第三方库以便它生成<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)
来估计位置,而不是硬编码它们。IMPORTED_LOCATION
设置为属性,则会收到以下警告: Policy CMP0111 is not set: An imported target missing its location property
fails during generation. Run "cmake --help-policy CMP0111" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.
IMPORTED_LOCATION not set for imported target "mytarget::mytarget"
configuration "Debug".
This warning is for project developers. Use -Wno-dev to suppress it.
- Michael Ngarimuset_library_configurations(mytarget)
设置的mytarget_LIBRARY来设置IMPORTED_LOCATION,然后再次限制为优化/调试模式。它可在DEBUG和RELEASE配置下正常运行,但不如看起来那么灵活。 - Michael Ngarimuset (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
< p >target_link_libraries 期望的行。
对于我的CMake 3.14.6版本,使用带有debug和optimized参数的target_link_libraries无法运行。 如果您遇到此问题,请尝试使用以下类型的代码:
set (FreeImage debug "FreeImageD" optimized "FreeImage")
set (Glog debug "glogd" optimized "glog")
set (EXTRA_LIBS ${FreeImage} ${Glog})
target_link_libraries(TexCompressor ${EXTRA_LIBS})