对导出的目标使用CMAKE_DEBUG_POSTFIX

时间:2018-08-21 09:38:39

标签: cmake

当我使用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" )

因此,与调试目标链接的程序仍使用release-build库,因此我需要将发行版和调试版本安装到不同的文件夹中,以便能够与调试目标链接。

如何使导出的目标与调试后缀一起使用?


我当然可以尝试根据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的Windows10。当然,最通用的解决方案可能是最好的解决方案。

1 个答案:

答案 0 :(得分:0)

根据install命令的文档,您需要引用您感兴趣的配置:

  

[...]如果给出了CONFIGURATIONS选项,则仅在安装了一种命名配置时才安装文件。此外,生成的导入文件将仅引用匹配的目标配置。 [...]

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