【问题标题】:Using CMAKE_DEBUG_POSTFIX with exported targets将 CMAKE_DEBUG_POSTFIX 与导出的目标一起使用
【发布时间】:2018-08-24 15:56:31
【问题描述】:

当我使用set(CMAKE_DEBUG_POSTFIX "d") 时,构建和安装目标按预期工作。但是在带有导出目标的libfooTargets-debug.cmake 文件中,有一个libfoo 的路径,而不是libfood

我这样导出目标:

install(TARGETS libfoo EXPORT libfoo-targets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin)
install(EXPORT libfoo-targets FILE libfooTargets.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})

在调试模式下创建和安装libfooTargets.cmakelibfooTargets-debug.cmake,在发布模式下创建和安装libfooTargets.cmakelibfooTargets-release.cmake

libfooTargets-release.cmakelibfooTargets-debug.cmake 都引用不带后缀的名称:

list(APPEND _IMPORT_CHECK_FILES_FOR_libfoo "${_IMPORT_PREFIX}/lib/libfoo.lib" )

因此链接到调试目标的程序仍然使用发布构建库,我需要将发布和调试版本安装到不同的文件夹中才能链接到调试目标。

如何让导出的目标与调试后缀一起工作?


我当然可以尝试根据 CMAKE_RELEASE_TYPECONFIGURATION 生成器表达式更改库名称,但这可能会破坏 MSVC 和其他支持不同目标的 IDE 中的多配置功能,并且似乎无法正常工作导出目标功能如何简化和统一构建的意义。

我怀疑install(EXPORT ...) 命令以某种方式删除了CMAKE_DEBUG_POSTFIX 或者没有实现它来生成libfooTargets-{release,debug}.cmake 文件,但可能我忽略了如何使这个变量对导出目标的生成器或类似的东西可见这个。


所有目标代码

cmake_minimum_required(VERSION 3.11.1)
project(foo)
include(CMakePackageConfigHelpers)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_DEBUG_POSTFIX "d")

# ...

add_library(libfoo STATIC somesource.cpp someheader.h)
target_include_directories(libfoo PUBLIC
         $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
target_link_libraries(libfoo
        somelibrary
)
target_include_directories (libfoo PUBLIC
        somelibrary_header_dirs
)
install(TARGETS libfoo EXPORT libfoo-targets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin)
install(EXPORT libfoo-targets FILE libfooTargets.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})

configure_package_config_file(libfooConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/libfooConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libfooConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
install(DIRECTORY include/ DESTINATION include FILES_MATCHING PATTERN "*.h")

平台是带有 cmake 3.11.1 和 MSVC 2015 的 Windows 10。当然,最通用的解决方案可能是最好的解决方案。

【问题讨论】:

  • 您能否分享您的 CMake add_library 命令以及您用于相关目标的所有其他命令?我通常在我构建的每个目标上指定CMAKE_DEBUG_POSTFIX,这样做并没有遇到任何问题,然后导出这些目标。
  • 我添加了add_librarytarget_... 命令。
  • 我看不出与我的版本有什么不同。尝试在 Project 命令后不久设置 CMAKE_DEBUG_POSTFIX 变量,因为此命令可能会覆盖您以前的一些设置。您在哪个平台上遇到这种行为?我在装有 MSVC 的 Windows 上看不到它。但文档说明This property is ignored on the Mac for Frameworks and App Bundles.
  • 我在帖子中添加了文件头。
  • 我在包配置助手包含之前移动了该行,现在它可以工作了。我把它移回去验证,它仍然有效。我不确定发生了什么(以及它是否可靠),所以我保留了包含之前的行。

标签: cmake


【解决方案1】:

根据install命令的文档,需要参考你感兴趣的配置:

[...] 如果给出了 CONFIGURATIONS 选项,那么只有在安装了指定配置之一时才会安装该文件。此外,生成的导入文件将仅引用匹配的目标配置。 [...]

因此,您需要在两个install 命令中添加CONFIGURATIONS 选项,并为要安装和导出的每个配置复制命令。

【讨论】:

  • 我没有使用 cmake 显式生成配置,因为这个项目与 MSVC 一起使用,它有自己的方式来选择调试或发布模式。这适用于后缀,但生成的目标是错误的,即使它似乎获得了配置(因为它生成为-debug.cmake 文件)。我不确定应该使用CONFIGURATIONS 选项设置什么才能使其正常工作。
  • @allo 不幸的是,我不在 Windows 上。该文档没有提到对每次构建可以生成多个配置的工具的具体处理。这可能会适当地引导 MSVC。为什么不尝试在这些命令中添加CONFIGURATIONS Debug
  • 因为cmake会生成一个统一的msvc工程,如果不指定任何东西,可以在不运行cmake的情况下进行Debug和Release配置之间的切换。使用 CMake 参数会很容易,然后我可以根据 CMAKE_RELEASE_TYPE 更改库名称。但这不会生成多配置 msvc 项目文件。我怀疑cmake导出的目标系统根本不尊重CMAKE_DEBUG_POSTFIX
  • @allo,我明白了。我在 CMake 的邮件列表和错误跟踪器中进行了一些挖掘,发现这个 thread 和这个 bug 标记为已解决。他们似乎相关并报告了 CMake 3.3 中解决的问题。
猜你喜欢
  • 2021-04-13
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多