如何将依赖第三方库的GitHub外部库接入CMake项目并解决Boost依赖问题
问题:外部库依赖的Boost头文件无法找到,CMake配置如何处理?
我通过以下CMake代码引入一个外部库:
ExternalProject_Add( http_server_dl GIT_REPOSITORY "https://github.com/av4625/http_server.git" GIT_TAG "beast" GIT_SHALLOW TRUE BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target http_server TEST_COMMAND "" INSTALL_COMMAND "" BUILD_BYPRODUCTS "<BINARY_DIR>/src/libhttp_server.a" ) ExternalProject_Get_Property(http_server_dl SOURCE_DIR BINARY_DIR) add_library(http_server IMPORTED STATIC GLOBAL) add_dependencies(http_server http_server_dl) file(MAKE_DIRECTORY ${SOURCE_DIR}/src) set_target_properties(http_server PROPERTIES IMPORTED_LOCATION ${BINARY_DIR}/src/libhttp_server.a INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/src)
该外部库依赖Boost,且它用Conan构建Boost,构建时能看到Conan在处理Boost,但当我在自己的代码中#include <server.hpp>时,出现错误:
fatal error: 'boost/noncopyable.hpp' file not found #include <boost/noncopyable.hpp>
我的库配置如下:
add_library(<my_lib> library_file.cpp) target_link_libraries(<my_lib> PRIVATE http_server)
请问如何修改配置,把所有依赖打包到http_server库中?
解决方案
1. 提取外部项目的Boost依赖信息
外部项目通过Conan构建Boost后,会在其构建目录生成conanbuildinfo.cmake文件,包含Boost的包含目录、链接库等信息。首先修改ExternalProject_Add,将该文件复制到主CMake可访问的位置:
ExternalProject_Add( http_server_dl GIT_REPOSITORY "https://github.com/av4625/http_server.git" GIT_TAG "beast" GIT_SHALLOW TRUE BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target http_server TEST_COMMAND "" # 复制conan配置文件到外部项目源码目录,方便主CMake读取 INSTALL_COMMAND ${CMAKE_COMMAND} -E copy <BINARY_DIR>/conanbuildinfo.cmake ${SOURCE_DIR}/conanbuildinfo.cmake BUILD_BYPRODUCTS "<BINARY_DIR>/src/libhttp_server.a" )
2. 导入Boost依赖并关联到http_server目标
在主CMake中读取Conan配置文件,提取Boost的依赖信息,并将其添加到http_server的INTERFACE属性中,实现依赖自动传递:
ExternalProject_Get_Property(http_server_dl SOURCE_DIR BINARY_DIR) # 引入外部项目生成的Conan配置文件 if(EXISTS ${SOURCE_DIR}/conanbuildinfo.cmake) include(${SOURCE_DIR}/conanbuildinfo.cmake) conan_basic_setup(TARGETS) endif() add_library(http_server IMPORTED STATIC GLOBAL) add_dependencies(http_server http_server_dl) file(MAKE_DIRECTORY ${SOURCE_DIR}/src) # 更新http_server的属性,追加Boost的包含目录和链接库 set_target_properties(http_server PROPERTIES IMPORTED_LOCATION ${BINARY_DIR}/src/libhttp_server.a INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/src;${CONAN_INCLUDE_DIRS_BOOST}" INTERFACE_LINK_LIBRARIES "${CONAN_LIBS_BOOST}" )
3. 验证依赖传递
完成上述配置后,你的<my_lib>在链接http_server时,Boost的包含目录和链接库会自动通过INTERFACE属性传递过去,无需在<my_lib>中单独配置Boost相关内容。
内容的提问来源于stack exchange,提问作者av4625
相关产品推荐
相关产品推荐

