某项目中需要用到mqtt.cpp,在寒武纪的盒子上编译mqtt.cpp。mqtt.cpp是依赖于mqtt.c的库和头文件的,前面我是先编译了mqtt.c,然后编译mqtt.cpp时用下面的cmake命令指定mqtt.c的库和头文件位置
cmake -DPAHO_WITH_SSL=OFF -DPAHO_MQTT_C_LIBRARIES=/home/chw/mqtt/paho.mqtt.c-master/install/lib64/libpaho-mqtt3a.so -DPAHO_MQTT_C_INCLUDE_DIRS=/home/chw/mqtt/paho.mqtt.c-master/install/include/ DCMAKE_INSTALL_PREFIX=../install ..
然后编译的时候报了如下错误
/home/chw/mqtt/paho.mqtt.c-master/install/lib64/libpaho-mqtt3a.so: error adding symbols: File in wrong format collect2: error: ld returned 1 exit status src/CMakeFiles/paho-mqttpp3.dir/build.make:99: recipe for target 'src/libpaho-mqttpp3.so.1.2.0' failed make[2]: *** [src/libpaho-mqttpp3.so.1.2.0] Error 1 CMakeFiles/Makefile2:89: recipe for target 'src/CMakeFiles/paho-mqttpp3.dir/all' failed make[1]: *** [src/CMakeFiles/paho-mqttpp3.dir/all] Error 2 Makefile:151: recipe for target 'all' failed make: *** [all] Error 2
看到这个错误的第一反应就想到这应该是因为arm的ld命令链接的库的格式却是x86格式的库,因此提示file in wrong format.
然后我去mqtt.c的install文件夹下用file命令看库的格式,
root@localhost:/home/chw/mqtt/paho.mqtt.c-master/install/lib64# file libpaho-mqtt3a.so.1.3.9 libpaho-mqtt3a.so.1.3.9: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
可以看到这个库的格式果然是x86-64的,而我们的寒武纪盒子是arm架构的,因此格式不识别,这时候我突然发现怎么mqtt.c的install文件夹里面有lib和lib64两个文件夹,于是我去lib文件夹下用file命令看看格式 。
root@localhost:/home/chw/mqtt/paho.mqtt.c-master/install/lib# file libpaho-mqtt3a.so.1.3.9 libpaho-mqtt3a.so.1.3.9: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1875ae7550029980d276187e883c154aa43c7356, not stripped
我惊喜的发现,lib文件夹下面的库竟然是ARM aarch64格式的,那么问题原因就找到了,我前面cmake配置的时候用的是lib64文件夹下面的库,所以将cmake配置时的mqtt.c的库路径换为lib文件夹即可。
cmake -DPAHO_WITH_SSL=OFF -DPAHO_MQTT_C_LIBRARIES=/home/chw/mqtt/paho.mqtt.c-master/install/lib/libpaho-mqtt3a.so -DPAHO_MQTT_C_INCLUDE_DIRS=/home/chw/mqtt/paho.mqtt.c-master/install/include/ DCMAKE_INSTALL_PREFIX=../install ..
另外:在下面编译mqtt.cpp库的时候,编译出来的库发现也是x86的,后来发现原因是我直接把之前在X86上编译mqtt.cpp 的工程拷贝过来,然后重新cmake的,并没有从github上重新下载源码,我重新下载源码然后cmake之后,编译出来的cpp库就是aarch64格式的了。
问题解决!
参考文献:
centos编译mqtt



