我正在撕扯我的头发,关于如何在我的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生成器正确使用第三方库?
非常感谢任何指针。
答案 0 :(得分:3)
缓存了对目标Foo的find_package的第一次调用
是。因此,您不能两次发出collection
并获得不同的结果(除非第一次调用失败)。
第三方软件包负责multionfig-usage,即应该正确编写find_package
/ *Config.cmake
文件。 (例如,Find*.cmake
支持多配置使用)。
否则,您应该以multiconfig方式使用包来做一些技巧。
例如,如果您认为配置之间的差异只是路径中的FindBoost.cmake
/ debug
子字符串,则可以调用release
进行调试安装,然后使用find_package()
获取特定于发布的路径:
string(REPLACE)