1、问题介绍
camke进行编译时候会根据当前平台来进行编译,编译出当前系统支持的格式就比如一般Linux不配置的情况下
编译出的文件格式为x86
linux下使用file filename 可以查看文件的属性,如果我们需要使用嵌入式支持的库那必须是ARM的,如果不是就会报如下错误
../libs//libprotobuf.so: file not recognized: File format not recognized
意思是库格式无法识别,进去查看格式发现可能为x86,平台不一样必然会导致文件无法识别而正确的应该是ARM xxx
libprotobuf.so.17.0.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=2986149ead5e8455e5721cad1039b9080cb4e854, stripped
此时我们需要进行源码交叉编译生成ARM平台可以正确运行的库。
2、解决办法
这里我就拿libprotobuf这个库举例,首先我们应该下载安装cmake跨平台编译器
这个自己去下载就好了,然后我们说说后面的具体实现
libprotobuf网上有源码自己可以下载,下载下来后进行加压可以看到protobuf-3.6.1,
编译的正常步骤是
cd cmake
mkdir build && cd build
cmake ../cmake
make -j2
按照这步骤编译出来的肯定不适合ARM,因为你是linux下编译的适合linux使用,这时候你需要设置自己平台和编译器,一般可能会借助一个文件去生成,命名为toolchain.cmake
关于toolchain.cmake可以阅读这一篇博客cmake交叉编译配置文件 - XXX.toolchain.cmake - 流水灯 - 博客园
添加方式也很简单指定好路径就可以
cmake -DCMAKE_TOOLCHAIN_FILE=/home/huzheng/work/t7_v1.2/buildroot-201611/target/user_rootfs_misc/rpts/zlib-1.2.11/toolchain.cmake ..
整个执行路径可以用一个脚本去实现,如cmake.mk,直接运行这个脚本进行编译
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=/home/huzheng/work/t7_v1.2/buildroot-201611/target/user_rootfs_misc/rpts/zlib-1.2.11/toolchain.cmake ..
make && sudo make install && /