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

JBa*_*erU 6 cmake visual-studio

我正在纠结如何在我的 cmake 项目中包含第三方库。目前我构建了 Poco 和一堆其他人,它们都生成了我与 find_package 一起使用的各自的 Config.cmake。我有一个包装构建脚本,它构建我的所有依赖项并将它们分别打包以进行调试和发布(我不想调整它们的 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}\"")
Run Code Online (Sandbox Code Playgroud)

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

任何指针都非常感谢。

Tsy*_*rev 6

目标 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}>"
)
Run Code Online (Sandbox Code Playgroud)

  • 我找到了这个 [package-example](https://github.com/forexample/package-example)。它的 `Foo` 包可以用作包导出的示例,它适用于 multiconfig。 (2认同)