在Windows上,我使用CMake(3.2.3)和Visual Studio 2015(社区)来构建名为Foo的C ++项目。 Foo由一个名为foo的共享库组成。我在Debug和Release配置中构建并安装Foo。我将CMAKE_DEBUG_POSTFIX
设置为_d
,以便Foo的安装包含foo.dll
和foo_d.dll
,以及CMake配置文件FooConfig.cmake
,FooTargets.cmake
,FooTargets-debug.cmake
和FooTargets-release.cmake
。
现在,我开始构建一个单独的CMake项目栏,它包含一个可执行的“bar”,它取决于库foo。但我在RelWithDebInfo配置中构建了bar。当我尝试从Visual Studio运行bar时,它会查找foo_d.dll
而不是foo.dll
。
也就是说,如果RelWithDebInfo配置下不存在依赖关系,则RelWithDebInfo配置会回退到Debug配置。
这是Foo的CMakeLists.txt:
project(Foo)
cmake_minimum_required(VERSION 3.2.3)
add_library(foo SHARED foo.h foo.cpp)
install(TARGETS foo EXPORT FooTargets DESTINATION
RUNTIME DESTINATION bin LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
configure_package_config_file(FooConfig.cmake.in
"${CMAKE_BINARY_DIR}/FooConfigToInstall.cmake"
INSTALL_DESTINATION cmake)
install(FILES ${CMAKE_BINARY_DIR}/FooConfigToInstall.cmake"
DESTINATION cmake RENAME FooConfig.cmake)
install(EXPORT FooTargets DESTINATION cmake)
以下是Bar的CMakeLists.txt:
project(Bar)
cmake_minimum_required(VERSION 3.2.3)
find_package(Foo)
add_executable(bar bar.cpp)
target_link_libraries(bar foo)
如果所需的配置不可用于依赖项,CMake如何确定哪些配置依赖于依赖项?
跟进:是否可以控制这种后备?理想情况下,不会有后备。我希望CMake给出一个错误,例如“无法在RelWithDebInfo配置中构建条,因为依赖关系foo在该配置中不可用(可用配置:Debug,Release)。
答案 0 :(得分:1)
使用FooConfig.cmake
包生成的脚本Foo
提供 IMPORTED 库目标foo
,Bar
用于链接。{ / p>
CMake有一个关于&#34;从项目配置映射到IMPORTED目标配置的概念。&#34;,这由属性MAP_IMPORTED_CONFIG_<CONFIG>确定:
将此值设置为可用于当前项目配置的导入目标的配置列表。从另一个项目导入的目标可能无法提供当前项目中可用的同一组配置名称。设置此属性会告知CMake在构建&lt; CONFIG&gt; 配置时,哪些导入的配置适合使用。选择由导入的目标提供的列表中的第一个配置。如果设置了此属性且没有可用的匹配配置,则认为找不到导入的目标。
您可以在脚本FooConfig.cmake.in
的末尾添加类似
set_target_property(foo PROPERTIES MAP_IMPORTED_CONFIG_RELWITHDEBINFO "prohibited")
因此无法在 RelWithDebInfo 配置中与foo
链接(因为foo
目标不提供名为&#34;禁止&#34;的配置。 )。