如何在易语言上做网站,云服务器租用价格表,机器人编程培训,福州网络推广建站提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、几个点二、回顾过程 1.上来就执行Makefile2.编译第三方开源库.a文件 2.1 build.sh脚本2.2 Makefile3.最终编译三、其它知识点总结 前言
提示#xff1a;这… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、几个点二、回顾过程 1.上来就执行Makefile2.编译第三方开源库.a文件 2.1 build.sh脚本2.2 Makefile3.最终编译三、其它知识点总结 前言
提示这里可以添加本文要记录的大概内容
在编译arm平台so文件时完成了以下的几个点
1、根据第三方开源的build.sh文件编译第三方开源库至于build.sh文件怎么写大概是看开源仓的README文件吧。
2、写了一个MakeFile文件并运行编译了.a文件。最近查资料的时候获取到一个知识点就是其实.a就是所有.o文件的集合。
3、根据子文件夹Makefile文件编译子文件夹.a文件。
4、解决编译过程中的多个问题 一、几个点
1、目标
在arm机器上编译出arm平台上可用的so文件
2、机器系统
[rootncn4a-mapopenservice-34-12-242 ~]# uname -a
Linux ncn4a-mapopenservice-34-12-242 4.19.36-vhulk1907.1.0.h1393.eulerosv2r8.aarch64 #1 SMP Thu Jan 5 17:52:22 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
3、build.sh和Makefile领悟
接前言。现在理解了build和Makefile的区别。源于我将makefile的文件内容放在了build.sh脚本中。然后感觉突然恍然大悟。
Makefile文件是用来编译代码的。里面是有CXXFLAGS就是将.c//cpp文件编译成.a文件。
OBJ关键词就要编译成.a还是.so文件格式。
而build.sh文件其实就是linux指令集合文件里面写了编译库的很多指令。其中就包括调用makefile的一步即调用make指令。
所以build.sh和makefile是有比较大的区别的。
而且自己写的代码只需要编写Makefile就可以了即只需要Makefile就可以了。因为用不到第三方开源库的.configure、make install。只需要一个make就可以了所以写个make就可以执行了。 二、过程回顾
1.上来就执行Makefile
拿到studio_compile工程后以为是直接执行build就可以了。但是执行时报了一个文件格式不对的错误
[2023-12-06 16:38:38] [rootncn4a-mapopenservice-34-12-242 compile_wrapper]# ll
[2023-12-06 16:38:39] total 16
[2023-12-06 16:38:39] drwxrwxr-x 2 root root 4096 Apr 27 2023 include
[2023-12-06 16:38:39] -rw-rw-r-- 1 root root 1926 Apr 27 2023 Makefile
[2023-12-06 16:38:39] drwxrwxr-x 2 root root 4096 Apr 27 2023 src
[2023-12-06 16:38:39] drwxrwxr-x 2 root root 4096 Apr 27 2023 vs
[2023-12-06 16:38:39] [rootncn4a-mapopenservice-34-12-242 compile_wrapper]# make -jm98
[2023-12-06 16:38:47] g -Werrorreturn-type -stdc0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.cpp -o src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.o
[2023-12-06 16:38:47] g -Werrorreturn-type -stdc0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include src/CompileLayerWrapper.cpp -o src/CompileLayerWrapper.o
[2023-12-06 16:38:47] g -Werrorreturn-type -stdc0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include src/ParseJNIObj.cpp -o src/ParseJNIObj.o
[2023-12-06 16:38:47] g -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE2 -O2 -s -ftrapv -fPIC -fstack-protector-all -static-libstdc -shared -o libcompile_wrapper.so ./src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.o ./src/CompileLayerWrapper.o ./src/ParseJNIObj.o -L../../../build/lib/linux -lcompiler -lconfigurator -lpreprocessor -lpbencoder -loperation -lcommon -L../../../3rd/gdal/lib/linux -lgdal -lgeos_c -lgeos -lproj -ljson-c -L../../../3rd/boost/lib/linux -lboost_serialization -lboost_filesystem -lboost_system -lboost_thread -L../../../3rd/protobuf/lib/linux -lprotobuf -L../../../3rd/sqlite/lib/linux/ -lsqlite3 -L../../../3rd/zlib/lib/linux/ -lz -L../../../3rd/gdal/src/libtiff/lib -ltiff -L../../../platform/HuaweiSecureC/lib/linux/ -lsecurec -ldl -lpthread
[2023-12-06 16:39:02] /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a: file format not recognized; treating as linker script
[2023-12-06 16:39:02] /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a:1: syntax error
[2023-12-06 16:39:02] collect2: error: ld returned 1 exit status
[2023-12-06 16:39:02] make: *** [Makefile:43: all] Error 1 即这一条 /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a: file format not recognized; treating as linker script
然后就查看一下libgdal.a文件格式使用file (filename)指令
[2023-12-06 17:41:48] [rootncn4a-mapopenservice-34-12-242 linux]# file libgdal.a
[2023-12-06 17:41:58] libgdal.a: ASCII text
[2023-12-06 17:41:58] [rootncn4a-mapopenservice-34-12-242 linux]# timed out waiting for input: auto-logout
这个显示情况其实还看不出来文件格式。这个ACII text文件其实是因为.a文件在windows环境下解压导致文件格式出问题了。但是其实正常的也会是x86的格式不是arm的格式。总而言之就是报错格式不对。
这个文件是第三方开源库静态库文件所以需要编译第三方开源静态库。
其实后来按照心哥的说法即便格式没有变成ASCII码也是需要重新编译第三方开源库的因为平台变了之前的.a文件是x86格式的。
这边不得不吐槽上传到git上的.a文件真是一点用没有啊。
2、编译第三方开源库.a文件
先后编译boost库、protobuf、sqlite、zlib、gdal库。其中有两个点需要单独领出来看。一个就是gdal库还有一个就是没有Makefile然后我自己写的makefile文件编译的。
先说gdal库。gdal需要依赖tiff库、json-c库、geos库、proj库最后才是安装gdal库。这边也是这次才理解的就是。就是对于这几个库自己感觉是编译其实也是在机器上安装这个库。可以用-- v查看版本号的。
然后这几个开源库用的build.sh脚本编译的。
2.1 build.sh
build.sh基本格式就是以下形式 PREFIX_INC_PATH$(cd $(dirname $0);pwd) //获取当前路径
git下载备注解压更改文件夹名可选可选进入含有configure文件的文件夹中执行./configure--prefix【】//设置安装路径--enable-xxx / --disable-xxx不懂--with-xxx / --without-xxx不懂--buildarm-linux //设置编译环境国产arm机器需要设置平台环境不然会configure失败导致build.sh失败 SQLITE3_CFLAGS路径 不懂 SQLITE3_LIBS路径 -lsqlite3 不懂 sh autogen.sh / autoreconf 不懂但是要安装autoconf全家桶可以参考本人帖子make -j8make install移动OBJ文件可选【完成】
2.2 Makefile
Makefile的格式大概如下
CXXFLAGS 用于将.c或.cpp文件编译成.o文件编译格式为 $(CXX) $(CXXFLAGS) $*.cpp -o $ CXXCXX xxx指定编译器
搜到这个帖子说的比较详细Linux Makefile入门总结-CSDN博客
看完这个贴子增加了对以下几个知识点的了解
元素说明备注 目标文件 : 依赖文件 [TAB]命令 [TAB]是你键盘左边tab键-c-c 是生成 .o 文件的必要参数gcc -c main.c -o main.o .PHONY: clean用来屏蔽同名clean的文件夹或文件 变量可修改 追加 : 常量不可修改 TARGET test CXX : g $(TARGET) # 相当于C语言的宏定义%c、%cpp、%o 隐含规则 任意的.c 或 任意的.cpp 或 任意的.o使用%c 或 %cpp 或 %o 或 %h 时优先加点.使用如%.c、%.cpp、%.o、%.h*.c、*.cpp、*.o所有的.c 或 所有的.cpp 或 所有的.o$^ 所有的依赖文件 依赖文件我要做这个操作依赖哪些东西 $(TARGET): $(OBJ) $(CXX) $^ -o $$所有依赖文件的第一个文件(应该也是最匹配的一个文件)%.o: %cpp $(CXX) $(CXXFLAGS) $ -o $$ 所有的目标文件 目标文件我要做这个操作要生成的东西 CXXFLAGS CXXFLAGS -c -Wall 类似于宏替换 SRC $(wildcard *.cpp)获取项目路径下的所有.cpp源文件OBJ $(patsubst %.cpp, %.o, $(SRC)) 根据源文件链接成 .o 文件wildcard 和 patsubst 是Makefile函数的用法-wall 编译后显示所有警告Makefile 中 -g、-o、-c、-f 、-D、-Wall、-L、含义 | 码农家园
这个帖子绝佳搞明白很多之前的疑问赞Makefile 中 -g、-o、-c、-f 、-D、-Wall、-L、含义 | 码农家园
3、最终编译
继续回顾流程显示用各个开源库的build.sh脚本把各个开源库编译一遍。再把子文件夹用Makefile编译一遍这个上面的帖子也说了每个子文件夹都有一个Makefile 这其中还有一个很奇怪的一个点就是工程写了一个build.sh脚本是进入每个子文件夹分别执行Makefile这个也是一个知识点。但这不是重点重点是用这个build.sh脚本执行编译时过程中会因为MobaXterm出现network断开导致编译失败所以我是对子文件夹单独编译的。可以编好。就很奇怪。
到此第三方开源库、子文件的静态库都编好了。其中过程中遇到好几个问题通过百度都解决了也记录在自己的文章中了。报错处理集-CSDN博客现在就开始编译最终的so文件了。
这其中还有一个知识点就是其实我之前理解的所谓交叉编译环境是在x86机器上安装检查编译工具。但是过程中问了心哥知道其实我用的这个欧拉系统是arm环境所以交叉编译是不是只能用arm机器呢这个问题留存解决。
解释百度了一下理解了意思就是交叉编译是因为目标平台可能不支持编译或者资源不够跨平台编译就叫交叉编译。如果像我这样就不算交叉编译了吧。
【百度百科
一个经常会被问到的问题就是“既然我们已经有了主机编译器那为什么还要交叉编译呢”其实答案很简单。有时是因为目的平台上不允许或不能够安装我们所需要的编译器而我们又需要这个编译器的某些特征有时是因为目的平台上的资源贫乏无法运行我们所需要编译器有时又是因为目的平台还没有建立连操作系统都没有根本谈不上运行什么编译器。
另一个经常会被问到的问题就是“既然可以交叉编译那还要主机编译干吗”其实答案也很简单交叉编译是不得已而为之与主机编译相比交叉编译受的限制更多虽然在理论上我们可以做任何形式的交叉编译但事实上由于受到专利、版权、技术的限制并不总是能够进行交叉编译尤其是在业余条件下举例来说我们至今无法生成惠普公司专有的som格式的可执行文件因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。来源交叉编译_百度百科】
还有一点就是这次编译过程比较复杂一方面是因为集气室离线的很多是要离线安装的。但是问了心哥说可以用yum install在线安装试了确实可以。这个可能跟是欧拉系统有关。
三、其他知识点
1、这边还有一个关于x86和arm平台区别的知识点找到这篇帖子https://www.cnblogs.com/kin-zhang/p/15031633.html
2、Makefile里面可以直接把.a换成.so吗编译.a和编译.so的Makefile有什么区别
这个需要后面了解下
Makefile链接静态库.a编译成动态库.so_makefile 链接.a-CSDN博客
3、linux安装git的用户设置
当时准备安装git拉取代码的不过发现并不可行所以没有深究下去。后面可以了解下。
4、LIB ar cr什么意思未知后面要了解下 总结 对整个编译过程进行了总结是有意义的编成功了。但是经验不复用应该是不好的需要把经验积累下来。突然想起来强哥之前一直说要经验复用大概也是指的这个意思吧。