如何只link到Conan包中的部分库?
How to link only to some of the libraries in Conan package?
我正在考虑开始使用 Conan package manager for managing third party dependencies of my C++ projects, but I cannot find how to link only to some of the libraries in Conan package. I'm using CMake as build system and I'm using Conan multi config CMake generator: 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 包中的所有库以及 其他 Conan 包中的所有库的依赖项Poco Conan 包依赖于 OpenSSL 和 zlib.
调试配置的 Visual Studio 项目选项中的附加依赖项设置为:
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoUtilmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoMongoDBmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoNetmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoNetSSLWinmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoCryptomdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoDatamdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoDataSQLitemdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoZipmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoXMLmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoJSONmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoFoundationmdd.lib
C:\Users\ivan.bobev\.conan\data\OpenSSL.0.2l\conan\stable\package\b17b520b4b55729a7391c6b2d20631fec4cf1564\lib\ssleay32.lib
C:\Users\ivan.bobev\.conan\data\OpenSSL.0.2l\conan\stable\package\b17b520b4b55729a7391c6b2d20631fec4cf1564\lib\libeay32.lib
C:\Users\ivan.bobev\.conan\data\zlib.2.11\conan\stable\package\c32596dcd26b8c708dc3d19cb73738d2b48f12a8\lib\zlibd.lib
是否可以 link 仅针对 Poco 包中的特定库?
我试图通过以下方式明确地仅列出我想要 link 的库:
target_link_libraries(${TARGET_NAME}
debug PocoFoundationmdd optimized PocoFoundationmd
debug PocoUtilmdd optimized PocoUtilmd)
但此后 lib 文件的路径设置不正确,也不包含 Poco[ 的目录=51=]包。
我用的是最新的柯南版本0.25.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()
是 "passive",除了声明 CONAN_XXX 变量外,它不应该做任何事情。因此,您可以在实际设置构建之前随意操作它们,这就是 conan_basic_setup()
所做的,它将这些变量转换为 cmake。
在任何情况下,除非您遇到链接性能问题,否则将所有 Poco 库留在那里可能没问题,除非最终可执行文件确实需要它们,否则它们不会被链接。
我正在考虑开始使用 Conan package manager for managing third party dependencies of my C++ projects, but I cannot find how to link only to some of the libraries in Conan package. I'm using CMake as build system and I'm using Conan multi config CMake generator: 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 包中的所有库以及 其他 Conan 包中的所有库的依赖项Poco Conan 包依赖于 OpenSSL 和 zlib.
调试配置的 Visual Studio 项目选项中的附加依赖项设置为:
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoUtilmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoMongoDBmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoNetmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoNetSSLWinmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoCryptomdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoDatamdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoDataSQLitemdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoZipmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoXMLmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoJSONmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco.7.8p3\pocoproject\stable\package348df82fcd362bbf088991f95bb229be582635\lib\PocoFoundationmdd.lib
C:\Users\ivan.bobev\.conan\data\OpenSSL.0.2l\conan\stable\package\b17b520b4b55729a7391c6b2d20631fec4cf1564\lib\ssleay32.lib
C:\Users\ivan.bobev\.conan\data\OpenSSL.0.2l\conan\stable\package\b17b520b4b55729a7391c6b2d20631fec4cf1564\lib\libeay32.lib
C:\Users\ivan.bobev\.conan\data\zlib.2.11\conan\stable\package\c32596dcd26b8c708dc3d19cb73738d2b48f12a8\lib\zlibd.lib
是否可以 link 仅针对 Poco 包中的特定库?
我试图通过以下方式明确地仅列出我想要 link 的库:
target_link_libraries(${TARGET_NAME}
debug PocoFoundationmdd optimized PocoFoundationmd
debug PocoUtilmdd optimized PocoUtilmd)
但此后 lib 文件的路径设置不正确,也不包含 Poco[ 的目录=51=]包。
我用的是最新的柯南版本0.25.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()
是 "passive",除了声明 CONAN_XXX 变量外,它不应该做任何事情。因此,您可以在实际设置构建之前随意操作它们,这就是 conan_basic_setup()
所做的,它将这些变量转换为 cmake。
在任何情况下,除非您遇到链接性能问题,否则将所有 Poco 库留在那里可能没问题,除非最终可执行文件确实需要它们,否则它们不会被链接。