如何用CMake编译含依赖库的独立C++程序用于树莓派2
如何用CMake构建可离线部署的树莓派C++程序
完全可以通过CMake配置实现将依赖库打包进程序或部署包,让无网的树莓派2无需安装依赖就能直接运行你的程序。针对你提到的三类依赖,分别处理如下:
1. 标准库(std)
标准库是系统基础组件,但如果要彻底消除对系统标准库动态版本的依赖,可以在CMake中开启全静态链接:
# 全局静态链接(包括标准库) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -pthread")
注意:静态链接标准库可能会导致程序体积增大,部分涉及动态加载的功能(如dlopen)会失效,但对于嵌入式场景的常规程序来说影响不大。
2. nlohmann/json库
nlohmann/json本质是头文件-only库,只要你在编译时将其头文件包含进项目,代码会直接编译进你的可执行程序中,不需要额外打包库文件。如果你的项目是通过CMake管理的,直接用FetchContent拉取源码(有网环境下)或者将头文件复制到项目目录即可:
# 用FetchContent拉取nlohmann/json(有网环境下) include(FetchContent) FetchContent_Declare( nlohmann_json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.2 # 指定稳定版本 ) FetchContent_MakeAvailable(nlohmann_json) # 链接到你的目标程序 target_link_libraries(your_program PRIVATE nlohmann_json::nlohmann_json)
3. libgpiod库(核心问题)
apt安装的libgpiod默认是动态库,要让无网设备无需安装就能运行,有两种可行方案:
方案一:静态链接libgpiod
在有网的树莓派上从源码编译libgpiod的静态库,然后链接到你的程序:
- 下载libgpiod源码:
git clone https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git cd libgpiod git checkout v1.6.3 # 指定兼容树莓派2的版本
- 编译静态库:
./autogen.sh ./configure --enable-static --disable-shared # 只生成静态库 make -j4 sudo make install # 安装到系统,或者直接用编译出的.a文件
- 在你的CMakeLists.txt中指定链接静态库:
# 找到静态库 find_library(LIBGPIOD_STATIC NAMES libgpiod.a PATHS /usr/local/lib) # 链接到目标程序 target_link_libraries(your_program PRIVATE ${LIBGPIOD_STATIC})
方案二:打包动态库并设置运行路径
如果不想编译静态库,可以把libgpiod的动态库文件复制到程序同目录,让程序运行时从本地加载:
- 在有网的树莓派上找到libgpiod的动态库:
sudo find / -name "libgpiod.so.*" # 通常路径是/usr/lib/arm-linux-gnueabihf/libgpiod.so.2
- 在CMake中设置程序的运行路径(rpath),让程序优先从当前目录找动态库:
target_link_options(your_program PRIVATE "-Wl,-rpath='$ORIGIN'")
- 部署时,将可执行程序和
libgpiod.so.*文件一起复制到USB,传到目标设备后直接运行即可。
部署注意事项
- 确保编译用的树莓派和目标树莓派2的系统版本、架构一致(都是ARM32位,同一版本Raspbian),避免兼容性问题。
- 静态编译后的程序体积会比动态链接大,但无需携带额外库文件;动态库打包的方式体积更小,但需要同时复制库文件。
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

