繁体   English   中英

使用Visual Studio进行调试和发布的find_package

[英]find_package for both debug and release with Visual Studio

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

我以为我可以做到:

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生成器正确使用第三方库?

任何指针都非常感谢。

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

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

它是负责*Config.cmake使用的第三方软件包,即应该正确编写*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}>"
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM