关于编译的一些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

 

posted @ 2024-05-14 13:58  碳酸钾K2CO3  阅读(3)  评论(0编辑  收藏  举报