2015-09-25 75 views
2

我正在撕掉我的头发,关于如何在我的cmake项目中包含第三方库。目前,我构建了Poco和其他一些产生它们各自的Config.cmake的函数,这些函数与find_package一起使用。我有一个包装构建脚本,它构建了所有的依赖关系,并将它们分别打包以进行调试和发布(我不想调整它们的cmake脚本,除非我确实真的需要,因为维护)。find_package同时用Visual Studio进行调试和发布

我想我可能只是做:

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}\"") 

这yeilds: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"

这似乎是第一次调用find_package为目标美孚缓存,WHIS我真的不希望。

我该怎么做呢?如何正确使用Visual Studio生成器来处理第三方库?

任何指针,非常感谢。

回答

2

第一次调用find_package为目标美孚缓存

是。因此,您不能发出find_package两次并获得不同的结果(除非第一次呼叫失败)。

这是第三方软件包是谁负责multiconfig使用,也就是说它应该已经正确地写入*Config.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}>" 
) 
+0

我目前使用你的答案的第二个选择,这是做这项工作(尽管它感觉有点哈克)。你有建议如何正确生成一个multiconfig * Config.cmake?如果没有太多的工作,我可能会走这条路,并向有问题的图书馆提交一个拉请求。 – JBarberU

+1

我发现这个[package-example](https://github.com/forexample/package-example)。它的'Foo'包可以用作包导出的例子,它正确地适用于多图。 – Tsyvarev

相关问题