【问题标题】:How to link only to some of the libraries in Conan package?如何仅链接到柯南包中的某些库?
【发布时间】:2018-01-31 19:16:32
【问题描述】:

我正在考虑开始使用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)

在我的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"

这会生成对 Conan 包中的所有库以及 Poco ConanConan 包中的所有库的依赖关系/strong> 包依赖于 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

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

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

target_link_libraries(${TARGET_NAME}
  debug PocoFoundationmdd optimized PocoFoundationmd
  debug PocoUtilmdd optimized PocoUtilmd)

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

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

【问题讨论】:

  • 一个问题:你有链接器性能问题吗?我猜你知道链接器不会使用不必要的库,所以除非你的链接步骤变得非常慢并且你需要真正优化它,否则最好保留默认库。

标签: c++ visual-c++ cmake package-managers conan


【解决方案1】:

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

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)

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

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)

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

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

【讨论】:

  • 这个方案还适用于柯南1.27.1吗?我正在使用包含多个库的 wt/4.3.1 包,其中一些库相互冲突,即:wthttpwttest。我想从${CONAN_LIBS} 中排除wttest。我怎样才能做到这一点?
  • 柯南食谱在最新的柯南 1.26(cmake_find_package 生成器)和柯南 1.27(cmake_find_package_multi 生成器)中学习了components。 ConanCenter 食谱采用它们可能需要几周时间,但一旦采用,就可以直接与 Poco::crypto 等目标链接。
  • 用户可以做些什么来加快他们使用但不拥有的 ConanCenter 中的包对组件的采用? IE。是否可以在某处打开类似 PR 的东西? (对不起,柯南/JFrog/等新手,所以只是测试一下,希望能加快速度)
  • 是的,github.com/conan-io/conan-center-index 存储库仍在 EAP 中,但任何申请该程序的用户都可以为任何现有的包做出贡献,提交新版本或全新的包。 ConanCenter 中的所有包都是从该 repo 自动创建的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多