如何仅链接到 Conan 包中的某些库?

bob*_*eff 5 c++ package-managers cmake visual-c++ conan

我正在考虑开始使用Conan包管理器来管理我的 C++ 项目的第三方依赖项,但我找不到如何仅链接到Conan包中的某些库。我使用CMake作为构建系统,并使用Conan多配置CMake生成器:cmake_multi

按照文档中的示例,我有以下代码:

project(FoundationTimer)
cmake_minimum_required(VERSION 2.8.12)

set(TARGET_NAME timer)

include(${CMAKE_BINARY_DIR}/conanbuildinfo_multi.cmake)
conan_basic_setup(TARGETS)

add_executable(${TARGET_NAME} timer.cpp)
target_link_libraries(${TARGET_NAME} CONAN_PKG::Poco)
Run Code Online (Sandbox Code Playgroud)

在我的CMakeLists.txt

使用CMake生成解决方案后:

conan install -g cmake_multi -s build_type=Debug -s compiler.runtime=MDd ..\mytimer\
conan install -g cmake_multi -s build_type=Release -s compiler.runtime=MD ..\mytimer\
cmake ..\mytimer\ -G "Visual Studio 14 2015 Win64"
Run Code Online (Sandbox Code Playgroud)

这会生成对Conan包中的所有库以及Poco Conan包所依赖的其他Conan包中的所有库(如OpenSSLzlib )的依赖关系。

用于调试配置的Visual Studio项目选项中的其他依赖项设置为:

C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoUtilmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoMongoDBmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoNetmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoNetSSLWinmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoCryptomdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoDatamdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoDataSQLitemdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoZipmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoXMLmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoJSONmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoFoundationmdd.lib
C:\Users\ivan.bobev\.conan\data\OpenSSL\1.0.2l\conan\stable\package\b17b520b4b55729a7391c6b2d20631fec4cf1564\lib\ssleay32.lib
C:\Users\ivan.bobev\.conan\data\OpenSSL\1.0.2l\conan\stable\package\b17b520b4b55729a7391c6b2d20631fec4cf1564\lib\libeay32.lib
C:\Users\ivan.bobev\.conan\data\zlib\1.2.11\conan\stable\package\c32596dcd26b8c708dc3d19cb73738d2b48f12a8\lib\zlibd.lib
Run Code Online (Sandbox Code Playgroud)

是否可以仅链接到 Poco 包中的特定库?

我尝试明确仅列出我想通过以下方式链接到的库:

target_link_libraries(${TARGET_NAME}
  debug PocoFoundationmdd optimized PocoFoundationmd
  debug PocoUtilmdd optimized PocoUtilmd)
Run Code Online (Sandbox Code Playgroud)

但此后,lib文件的路径未正确设置,也不包含Poco包的目录。

我正在使用最新的柯南版本0.25.1

dro*_*dri 3

我认为最好的方法是在调用设置步骤之前过滤或定义必要的库。就像是:

include(${CMAKE_BINARY_DIR}/conanbuildinfo_multi.cmake)
# Just the libraries you want
set(CONAN_LIBS_POCO PocoUtilmd PocoMongoDBmd PocoFoundationmd ws2_32 Iphlpapi.lib)
conan_basic_setup(TARGETS)
Run Code Online (Sandbox Code Playgroud)

请注意,还有一些其他系统库,并且库名称在不同操作系统和不同配置中可能有所不同。所以可能最好过滤掉(类似这样的东西,未经测试):

include(${CMAKE_BINARY_DIR}/conanbuildinfo_multi.cmake)
set(_my_poco_libs)
foreach(_library IN ${CONAN_LIBS_POCO})
   if(NOT ${_library} MATCHES "yourRegexToDiscardUnwantedLibs")
       list(APPEND _my_poco_libs ${_library})
   endif()
enforeach()
set(CONAN_LIBS_POCO ${_my_poco_libs})
conan_basic_setup(TARGETS)
Run Code Online (Sandbox Code Playgroud)

请注意,include()生成的conanbuildinfo.cmake文件的 是“被动”的,除了声明 CONAN_XXX 变量之外,它不应该执行任何操作。因此,在实际设置构建之前,您可以按照自己想要的方式操作它们conan_basic_setup(),这就是将这些变量转换为 cmake。

在任何情况下,除非您遇到链接性能问题,否则您可能可以将所有 Poco 库保留在那里,除非它们对于最终可执行文件确实是必需的,否则它们不会被链接。

  • 柯南食谱在最新的柯南1.26(cmake_find_package生成器)和柯南1.27(cmake_find_package_multi生成器)中学习了[组件](https://docs.conan.io/en/latest/creating_packages/package_information.html#using-components)。ConanCenter 配方可能需要几周时间才能采用它们,但一旦采用,就可以直接与“Poco::crypto”等目标链接。 (2认同)