关于编译的一些debug记录
1. 背景:
现在想将嵌入式开发板部署成边缘控制器,需要在开发板上部署一个服务。我们已经写了一个c语言的应用,现在需要将其编译成适配64位arm架构的2进制可执行文件
2. bug:
在编译的时,输入命令:
g++ -fdiagnostics-color=always -g unifiedAccessServer.cpp baseModels/control/ec/ecBaseModel.cpp baseModels/control/ec/ecBaseModel.h baseModels/defineDeviceFolder.h baseModels/defineDeviceFolder.cpp -ljsoncpp -lopen62541 -L /usr/local/libs -ljsoncpp -L.-lssh -o unifiedAccessServer
会出现bug:
In file included from unifiedAccessServer.cpp:6: baseModels/control/ec/ecBaseModel.h:2:10: fatal error: json.h: No such file or directory 2
| #include <json.h> | ^~~~~~~~ compilation terminated.
这应该是jsoncpp库没有被链接导致的错误,但反复检查,这个库已经安装了,也用-ljsoncpp链接了,也试过指定库的位置,但还是会报错,可能的问题:
因为这个报错就是无法找到jsoncpp这个标准库文件导致的,即利用-L /usr/local/libs指定的位置实际上没有jsoncpp库,即利用pkg-config命令找的位置可能并非最终库文件所在位置。
3. debug:
将有关的源文件下载后,编译直接保存在工程目录下,具体可参考:https://blog.csdn.net/zywhehe/article/details/108106315
使用其中第一大点方法“一、JsonCpp源代码——超级简单,推荐!!!”
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated-(Possibly-outdated)
(1)下载.ZIP包,解压
(2)python执行amalgamate.py
(3)将dist目录下的两个.h文件和一个.cpp文件复制到项目代码文件目录下
(3)在项目中添加现有项,加入上述文件
修改jsoncpp.cpp中的头文件为对应引用:#include "json.h"
针对我的项目,在利用python编译出jsoncpp库的有关.cpp,.h文件后,进行如下修改:
(1)将源码加入源代码目录
其中lib文件夹为(都是python执行amalgamate.py生成的文件)
(2)然后将引用json.cpp的地方全改为#include "json.h",如(注意,这个ecBaseModel.h文件是在baseModels文件夹目录中的,非根目录中的;这样也是可以的)
(3)在当前根目录,即EC-after文件夹中输入编译命令:
g++ -fdiagnostics-color=always -g -Ilib unifiedAccessServer.cpp baseModels/control/ec/ecBaseModel.cpp baseModels/control/ec/ecBaseModel.h baseModels/defineDeviceFolder.h baseModels/defineDeviceFolder.cpp -ljsoncpp -lopen62541 -lssh -o unifiedAccessServer
其中-I(大写的i)l(小写的L)ib,指定了库文件的位置,即可编译成功!
但还是无法适配于arm架构,仍有问题,编译结果如下:
可以发现是源代码有维妮塔,将常指针const char* 赋值给了变指针char*,在源代码中调整有关代码后,输入编译代码:
g++ -fdiagnostics-color=always -g -Ilib/json unifiedAccessServer.cpp baseModels/control/ec/ecBaseModel.cpp baseModels/control/ec/ecBaseModel.h baseModels/defineDeviceFolder.h baseModels/defineDeviceFolder.cpp -ljsoncpp -lopen62541 -lssh -pthread -o unifiedAccessServer
注意,上述编译命令中增加了对pthread库的链接
即可编译成功,并直接调用生成的可执行文件,发现服务已启动:
【其他】
曾尝试过使用针对aarm架构的编译器进行编译,按照如下操作方式操作:(后来发现不是这个原因,是因为编译没有成功的原因,但仍记录一下)
(1)利用apt命令查看可用的aarch64编译器
apt-cache search aarch64
会发现返回了
binutils-aarch64-linux-gnu - GNU binary utilities, for aarch64-linux-gnu target
binutils-aarch64-linux-gnu-dbg - GNU binary utilities, for aarch64-linux-gnu target (debug symbols)
g++ - GNU C++ compiler
gcc - GNU C compiler
qemu-efi-aarch64 - UEFI firmware for 64-bit ARM virtual machines
qemu-system-arm - QEMU full system emulation binaries (arm)
qemu-efi - transitional dummy package
libne10-10 - ARM neon (SIMD) library
libne10-dev - ARM neon (SIMD) library - development files
这些都是aarch64
架构的一些软件包。在这些软件包中,binutils-aarch64-linux-gnu
是用于 aarch64-linux-gnu
目标的 GNU 二进制工具,而 g++
是 GNU 的 C++ 编译器,可以用于编译 aarch64
架构的程序。
(2)安装编译器
sudo apt-get install g++ binutils-aarch64-linux
(3)运行编译命令
aarch64-linux-gnu-g++ -fdiagnostics-color=always -g -Ilib unifiedAccessServer.cpp baseModels/control/ec/ecBaseModel.cpp baseModels/control/ec/ecBaseModel.h baseModels/defineDeviceFolder.h baseModels/defineDeviceFolder.cpp -ljsoncpp -lopen62541 -lssh -o unifiedAccessServer