我正在为如何将第三方库包含在我的 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 生成器正确使用第三方库?
非常感谢任何指点。
对目标 Foo 的 find_package 的第一次调用被缓存
是的。所以你不能发出find_package
两次并得到不同的结果(除非第一次调用失败)。
它是负责多重配置使用的第三方包,也就是说它应该正确编写*Config.cmake
/Find*.cmake
文件。 (例如。,FindBoost.cmake
支持多配置使用)。
否则,您应该采取一些技巧以多重配置方式使用包。
例如,如果您猜测配置之间的唯一区别是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}>"
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)