CMake如何确定目标依赖项的回退构建配置?

时间:2016-10-13 19:39:32

标签: c++ visual-studio dll cmake

背景

在Windows上,我使用CMake(3.2.3)和Visual Studio 2015(社区)来构建名为Foo的C ++项目。 Foo由一个名为foo的共享库组成。我在Debug和Release配置中构建并安装Foo。我将CMAKE_DEBUG_POSTFIX设置为_d,以便Foo的安装包含foo.dllfoo_d.dll,以及CMake配置文件FooConfig.cmakeFooTargets.cmakeFooTargets-debug.cmakeFooTargets-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)。

1 个答案:

答案 0 :(得分:1)

使用FooConfig.cmake包生成的脚本Foo提供 IMPORTED 库目标fooBar用于链接。{ / 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;的配置。 )。