Linux下编译C程序本地链接mosquitto共享库报错排查
链接失败根本原因
GCC 调用链接器处理 -l<库名> 参数时,遵循固定的文件命名匹配规则:传入 -lmosquitto 时,链接器只会在指定搜索路径下查找文件名为 libmosquitto.so 的共享库文件。
你当前目录下仅复制了带版本后缀的 libmosquitto.so.1,缺少符合匹配规则的无版本后缀入口文件,因此即使添加 -L. 指定当前目录为搜索路径,链接器依然无法识别到目标库。
x86平台本地验证解决步骤
- 进入库存放的
~/hello/目录,创建符合链接规则的软链接:
ln -s libmosquitto.so.1 libmosquitto.so
- 重新执行编译链接命令,注意
-L路径参数需要放在-l库参数之前:
gcc -o hello hello.c -L. -lmosquitto
- 运行编译生成的程序前,需要指定动态库加载路径,避免运行时加载器找不到同级目录下的共享库:
LD_LIBRARY_PATH=./ ./hello
ARM交叉编译注意事项
- 必须使用对应ARM目标平台的交叉编译工具链(例如
arm-linux-gnueabihf-gcc)替换原生x86版本的gcc,不能混用x86编译产出的库文件 - 提前用ARM交叉编译工具链重新编译mosquitto源码,生成ARM架构版本的
libmosquitto.so.1,不要直接使用x86平台编译出的库文件 - 在ARM版本库的存放目录下,同样创建
libmosquitto.so指向对应版本libmosquitto.so.1的软链接 - 链接时通过
-L<ARM版本库存放路径>参数指定交叉编译专用的库搜索路径,避免链接器误搜索系统默认的x86架构库目录 - 程序部署到ARM目标板时,只需要将ARM版本的
libmosquitto.so.1拷贝到目标板程序同级目录,运行时通过LD_LIBRARY_PATH指定加载路径即可,不需要在开发机或目标板做全局库安装。
内容的提问来源于stack exchange,提问作者thecdoctor
相关产品推荐
相关产品推荐

