当我使用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.cmake
和libfooTargets-debug.cmake
,在发布模式下会创建并安装libfooTargets.cmake
和libfooTargets-release.cmake
。
libfooTargets-release.cmake
和libfooTargets-debug.cmake
都将没有后缀的名称引用为:
list(APPEND _IMPORT_CHECK_FILES_FOR_libfoo "${_IMPORT_PREFIX}/lib/libfoo.lib" )
因此,与调试目标链接的程序仍使用release-build库,因此我需要将发行版和调试版本安装到不同的文件夹中,以便能够与调试目标链接。
如何使导出的目标与调试后缀一起使用?
我当然可以尝试根据CMAKE_RELEASE_TYPE
或CONFIGURATION
生成器表达式来更改库名,但这可能会破坏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。当然,最通用的解决方案可能是最好的解决方案。
答案 0 :(得分:0)
根据install
命令的文档,您需要引用您感兴趣的配置:
[...]如果给出了CONFIGURATIONS选项,则仅在安装了一种命名配置时才安装文件。此外,生成的导入文件将仅引用匹配的目标配置。 [...]
因此,您需要在两个CONFIGURATIONS
命令中添加install
选项,并为要安装和导出的每个配置复制这些命令。