如何在CMakeLists.txt中满足find_package()以联动构建sdbus-cpp?
解决sdbus-cpp与源码一同构建并满足find_package()的方法
要让sdbus-cpp和你的项目源码一起构建,同时兼容find_package(sdbus-c++)的调用,无需用户手动安装库,有两种可靠的CMake方案:
方案1:用FetchContent自动拉取并构建(推荐)
CMake的FetchContent模块可以自动克隆、配置并构建sdbus-cpp,无需用户手动操作子模块。在项目根目录的CMakeLists.txt中添加以下代码:
# 引入FetchContent模块 include(FetchContent) # 声明sdbus-cpp的仓库信息,可指定具体版本标签(比如v1.4.0) FetchContent_Declare( sdbus-cpp GIT_REPOSITORY https://github.com/Kistler-Group/sdbus-cpp.git GIT_TAG master # 替换为你需要的版本标签更稳定 ) # 禁用sdbus-cpp的示例和测试构建,减少编译时间 set(BUILD_EXAMPLES OFF CACHE BOOL "Build sdbus-c++ examples" FORCE) set(BUILD_TESTS OFF CACHE BOOL "Build sdbus-c++ tests" FORCE) # 如需静态库,取消下面一行注释 # set(BUILD_STATIC_LIBS ON CACHE BOOL "Build sdbus-c++ static library" FORCE) # 拉取并构建sdbus-cpp FetchContent_MakeAvailable(sdbus-cpp) # 现在可以正常调用find_package find_package(sdbus-c++ REQUIRED) # 将sdbus-c++链接到你的目标 add_executable(your_app main.cpp) target_link_libraries(your_app PRIVATE sdbus-c++::sdbus-c++)
原理:FetchContent_MakeAvailable会把sdbus-cpp的CMake配置路径自动加入到CMake的搜索路径中,而sdbus-cpp本身提供了标准的Config模式配置文件(sdbus-c++Config.cmake),所以find_package能直接找到本地构建的库。
方案2:用Git子模块手动添加
如果你偏好手动管理依赖代码,可以把sdbus-cpp作为Git子模块加入项目:
- 执行终端命令添加子模块:
git submodule add https://github.com/Kistler-Group/sdbus-cpp.git thirdparty/sdbus-cpp
- 在项目根
CMakeLists.txt中添加子目录并配置:
# 配置sdbus-cpp的构建选项 set(BUILD_EXAMPLES OFF CACHE BOOL "Build sdbus-c++ examples" FORCE) set(BUILD_TESTS OFF CACHE BOOL "Build sdbus-c++ tests" FORCE) # 添加sdbus-cpp子目录进行构建 add_subdirectory(thirdparty/sdbus-cpp) # 调用find_package或直接链接目标 find_package(sdbus-c++ REQUIRED) target_link_libraries(your_app PRIVATE sdbus-c++::sdbus-c++)
为什么之前的尝试没成功?
- 不需要手动写
Find*.txt:sdbus-cpp官方已经提供了Config模式的配置文件,只要它的构建路径被CMake识别,find_package就能自动找到。 - 无需执行
install():install()是把库安装到系统全局路径用的,而本地构建的库通过FetchContent或add_subdirectory已经被项目直接引用,不需要安装步骤。
内容的提问来源于stack exchange,提问作者synalice
相关产品推荐
相关产品推荐

