【问题标题】:find_package for both debug and release with Visual Studio使用 Visual Studio 进行调试和发布的 find_package
【发布时间】:2015-09-25 10:26:36
【问题描述】:

对于如何在我的 cmake 项目中包含第三方库,我感到很头疼。目前,我构建 Poco 和其他一些生成它们各自的 Config.cmake 的工具,我将其与 find_package 一起使用。我有一个包装构建脚本,它构建我所有的依赖项并将它们分别打包以进行调试和发布(我不想调整他们的 cmake 脚本,除非我真的真的需要因为维护)。

我以为我可以这样做:

find_package(Foo
            HINTS "${CMAKE_SOURCE_DIR}/some/path/debug/libFoo/lib/cmake"
            REQUIRED
)
get_target_property(LIB_FOO_DEBUG lib_foo LOCATION)

find_package(Foo
            HINTS "${CMAKE_SOURCE_DIR}/some/path/release/libFoo/lib/cmake"
            REQUIRED
)
get_target_property(LIB_FOO_RELEASE lib_foo LOCATION)

set(LIB_FOO_LIBRARIES optimized "${LIB_FOO_RELEASE}" debug "${LIB_FOO_DEBUG}")

message("LIB_FOO_LIBRARIES: \"${LIB_FOO_LIBRARIES}\"")

这是:LIB_FOO_LIBRARIES: "optimized;C:/path/to/proj/some/path/debug/libFoo/lib/foo.lib;debug;C:/path/to/proj/some/path/debug/libFoo/lib/foo.lib"

似乎对目标 Foo 的 find_package 的第一次调用已被缓存,而我并不真正想要。

我是不是走错了路?如何使用 Visual Studio 生成器正确处理第三方库?

非常感谢任何指针。

【问题讨论】:

    标签: visual-studio cmake


    【解决方案1】:

    对目标 Foo 的 find_package 的第一次调用被缓存

    是的。所以你不能两次发出find_package 并得到不同的结果(除非第一次调用失败)。

    是第三方包负责multiconfig-usage,也就是说它应该正确写入*Config.cmake/Find*.cmake文件。 (例如,FindBoost.cmake 支持多配置使用)。

    否则,你应该做一些技巧来使用 multiconfig 方式的包。

    例如,如果您猜测配置之间的唯一区别是路径中的debug/release 子字符串,则可以调用find_package() 进行调试安装,然后使用string(REPLACE) 获取特定于发布的路径:

    find_package(Foo
            HINTS "${CMAKE_SOURCE_DIR}/some/path/debug/libFoo/lib/cmake"
            REQUIRED
    )
    
    get_target_property(LIB_FOO_DEBUG lib_foo LOCATION)
    string(REPLACE debug release LIB_FOO_RELEASE ${LIB_FOO_DEBUG})
    
    # Use generator expressions, so variable can be used not only by target_link_libraries.
    set(LIB_FOO_LIBRARIES
            "$<$<NOT:$<CONFIG:DEBUG>>:${LIB_FOO_RELEASE}>"
            "$<$<CONFIG:DEBUG>:${LIB_FOO_DEBUG}>"
    )
    

    【讨论】:

    • 我目前正在使用您答案的第二种选择,它可以完成这项工作(尽管感觉有点笨拙)。您对如何正确生成 multiconfig *Config.cmake 有什么建议吗?如果工作量不大,我可能会走这条路并向相关库提交拉取请求。
    • 我找到了这个package-example。它的Foo 包可以用作包导出的示例,它适用于multiconfig。
    猜你喜欢
    • 2016-12-14
    • 2011-08-09
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2011-03-09
    • 2014-09-11
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多