【发布时间】: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.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" )
因此链接到调试目标的程序仍然使用发布构建库,我需要将发布和调试版本安装到不同的文件夹中才能链接到调试目标。
如何让导出的目标与调试后缀一起工作?
我当然可以尝试根据 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 的 Windows 10。当然,最通用的解决方案可能是最好的解决方案。
【问题讨论】:
-
您能否分享您的 CMake
add_library命令以及您用于相关目标的所有其他命令?我通常在我构建的每个目标上指定CMAKE_DEBUG_POSTFIX,这样做并没有遇到任何问题,然后导出这些目标。 -
我添加了
add_library和target_...命令。 -
我看不出与我的版本有什么不同。尝试在 Project 命令后不久设置 CMAKE_DEBUG_POSTFIX 变量,因为此命令可能会覆盖您以前的一些设置。您在哪个平台上遇到这种行为?我在装有 MSVC 的 Windows 上看不到它。但文档说明
This property is ignored on the Mac for Frameworks and App Bundles. -
我在帖子中添加了文件头。
-
我在包配置助手包含之前移动了该行,现在它可以工作了。我把它移回去验证,它仍然有效。我不确定发生了什么(以及它是否可靠),所以我保留了包含之前的行。
标签: cmake