基于libpqxx的Ubuntu QT应用移植树莓派3编译报错求助
解决Qt+libpqxx交叉编译到树莓派3的头文件缺失问题
嘿,看来你在把Qt+libpqxx应用交叉编译到树莓派3的时候踩了头文件缺失的坑——这其实是交叉编译里很常见的问题,毕竟本地Ubuntu的x86库和树莓派的armhf架构完全不兼容,直接用桌面版的libpqxx肯定行不通。我给你梳理几个实打实的解决步骤:
1. 为树莓派架构交叉编译libpqxx库
你不能直接用Ubuntu桌面装的libpqxx,得专门给armhf架构编译一份:
- 先拉取对应版本的libpqxx源码(比如从官方仓库clone)
- 先配置交叉编译工具链的环境变量,用树莓派官方工具链的话,前缀是
arm-linux-gnueabihf-,所以执行:export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++ - 然后配置编译参数,指定一个专门的安装目录(比如
/home/your/raspi-cross-libs,方便之后Qt项目引用):
如果是用configure的旧版本libpqxx:
如果是cmake版本的libpqxx:./configure --host=arm-linux-gnueabihf --prefix=/home/your/raspi-cross-libscmake -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ -DCMAKE_INSTALL_PREFIX=/home/your/raspi-cross-libs . - 最后执行
make && make install,编译好的arm版本libpqxx就会乖乖待在你指定的目录里了。
2. 修改Qt项目的.pro文件,指定交叉编译路径
打开你的Qt项目.pro文件,添加针对arm架构的头文件和库路径配置,这样Qt交叉编译时才会找到正确的文件:
# 针对树莓派arm交叉编译的配置 contains(QMAKE_TARGET.arch, arm): { INCLUDEPATH += /home/your/raspi-cross-libs/include LIBS += -L/home/your/raspi-cross-libs/lib -lpqxx -lpq } # 本地x86编译保留原来的配置 else { INCLUDEPATH += /usr/include/postgresql LIBS += -lpqxx -lpq }
记得把路径换成你刚才设置的实际目录哦。
3. 搞定libpq的依赖问题
libpqxx依赖PostgreSQL的C库libpq,如果编译libpqxx时提示找不到libpq,你有两个选择:
- 同样交叉编译PostgreSQL的libpq库,步骤和上面的libpqxx类似;
- 直接从树莓派系统里拷贝对应的头文件和库文件到交叉工具链的sysroot目录,比如把树莓派上的
/usr/include/postgresql和/usr/lib/arm-linux-gnueabihf/libpq.so同步到交叉工具链的sysroot对应路径。
4. 检查交叉工具链的sysroot配置
很多时候找不到头文件是因为工具链的sysroot没包含树莓派的系统文件。你可以用rsync把树莓派上的系统头文件和库同步到工具链的sysroot里:
rsync -avz pi@raspberrypi:/usr/include/ /path/to/your/cross-toolchain/sysroot/usr/include/ rsync -avz pi@raspberrypi:/usr/lib/arm-linux-gnueabihf/ /path/to/your/cross-toolchain/sysroot/usr/lib/arm-linux-gnueabihf/
这样工具链编译时会优先从sysroot里找arm架构的文件,避免用本地的x86版本。
最后提个醒:把编译好的应用部署到树莓派后,要确保树莓派上已经装了libpqxx5和postgresql-client这些运行库,不然运行时会提示找不到库文件哦。
内容的提问来源于stack exchange,提问作者Minion
相关产品推荐
相关产品推荐

