近日,使用nlopt库(一个求最优解的C++库)时遇到的一个问题,已解决,与大家分享一下,并顺便作为自己的笔记吧(linux小白的学习笔记)。
首先,是调试时,代码写好后,在桌面编译器编译是没有问题的(用的是qt),正常输出结果。由于此代码最终需要在arm上运行,需要用交叉编译器进行编译,但是编译器一换到交叉编译器就报以下错误:
对于此报错一开始在网上搜了下,基本上可以确定是库识别不了的问题,由于代码的编写风格是C11的,这个交叉编译器是C99的,一开始以为是这样的问题,ok,按C99的风格改回来之后发现还是报错,于是便想是不是其他原因,于是又查了查,发现原因大概就是nlopt库安装的时候用的是桌面编译器,查的方法是在文件路径下输入以下命令(我是安装在桌面的):
file libnlopt.so.0.11.0
看得出来是x86-64的,而我要编译的是arm版本的,所以这就是原因所在。
在nlopt库官方网站下载的安装包里的readme文件有清楚的写到安装方法(在安装包用终端打开出入以下命令):
mkdir build
cd build
cmake …
make
sudo make install
我一开始就是按照这个步骤安装的,这个步骤安装完由于系统默认的是桌面编辑器,所以装出来的是x86-64的。
我们需要先找到arm交叉编译器的路径,输入命令:
whereis arm-linux-gcc
得到交叉编译器的路径,然后在原来安装方法的基础上,其他步骤不变,第三步camke改为:
sudo cmake … -DCMAKE_C_COMPILER=/usr/local/DigiEL-5.9/x-tools/arm-cortex_a8-linux-gnueabi/bin/arm-linux-gcc -DCMAKE_CXX_COMPILER=/usr/local/DigiEL-5.9/x-tools/arm-cortex_a8-linux-gnueabi/bin/arm-linux-g++
最后我们检验一下,去到.so动态库的安装路径下输入file命令:
这时已经arm版本了,程序里调用这个库进行交叉编译也没有报错了。
觉得有用的话给我点个赞哈哈哈。