提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
在编译arm平台so文件时,完成了以下的几个点:
1、根据第三方开源的build.sh文件编译第三方开源库,至于build.sh文件怎么写,大概是看开源仓的README文件吧。
2、写了一个MakeFile文件并运行编译了.a文件。最近查资料的时候获取到一个知识点就是,其实.a就是所有.o文件的集合。
3、根据子文件夹Makefile文件编译子文件夹.a文件。
4、解决编译过程中的多个问题
1、目标
在arm机器上编译出arm平台上可用的so文件
2、机器系统
[root@ncn4a-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就可以执行了。
拿到studio_compile工程后,以为是直接执行build就可以了。但是执行时报了一个文件格式不对的错误
[2023-12-06 16:38:38] [root@ncn4a-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] [root@ncn4a-mapopenservice-34-12-242 compile_wrapper]# make -jm98
[2023-12-06 16:38:47] g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -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++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -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++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -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_SOURCE=2 -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] [root@ncn4a-mapopenservice-34-12-242 linux]# file libgdal.a
[2023-12-06 17:41:58] libgdal.a: ASCII text
[2023-12-06 17:41:58] [root@ncn4a-mapopenservice-34-12-242 linux]# timed out waiting for input: auto-logout
这个显示情况其实还看不出来文件格式。这个ACII text文件其实是因为.a文件在windows环境下解压导致文件格式出问题了。但是其实正常的,也会是x86的格式,不是arm的格式。总而言之,就是报错格式不对。
这个文件是第三方开源库静态库文件,所以需要编译第三方开源静态库。
其实后来按照心哥的说法,即便格式没有变成ASCII码也是需要重新编译第三方开源库的,因为平台变了,之前的.a文件是x86格式的。
这边不得不吐槽,上传到git上的.a文件真是一点用没有啊。
先后编译boost库、protobuf、sqlite、zlib、gdal库。其中有两个点需要单独领出来看。一个就是gdal库,还有一个就是没有Makefile然后我自己写的makefile文件编译的。
先说gdal库。gdal需要依赖tiff库、json-c库、geos库、proj库,最后才是安装gdal库。这边也是这次才理解的就是。就是对于这几个库,自己感觉是编译,其实也是在机器上安装这个库。可以用-- v查看版本号的。
是的,所以查看版本号方式
protobuf | protoc --version |
gdal | gdalinfo --version |
额,过了两天差版本号竟然都查不到。。。
然后这几个开源库用的build.sh脚本编译的。
后来就一直查不到版本号,我骑车的时候突然想到,会不会是我没有设置环境变量呢?先不纠结了,因为也没有太大的影响。
以下是可行的
proj -v | 前提:做了软链接 | |
${PREFIX_INC_PATH}/libproj/bin/proj |
||
${PREFIX_INC_PATH}/libgeos/bin/geos/geos-config --version |
proj:
proj、geos:
build.sh基本格式就是以下形式
PREFIX_INC_PATH=$(cd "$(dirname "$0")";pwd) | //获取当前脚本路径 |
#!/bin/bash |
必须 | |
set -e set -x |
“set -e” 若指令传回值不等于0,则立即退出shell 执行指令后,会先显示该指令及所下的参数 注释② |
|
git下载 | 备注 | |
解压 | ||
更改文件夹名(可选) | 可选 | |
进入含有configure文件的文件夹中 | 有的新版本没有configure文件,一般是要执行autogen.sh文件生成 | |
执行./configure | --prefix=【prefix_path】,//设置安装路径 | 安装后的文件就在prefix_path路径中 |
--enable-xxx / --disable-xxx | 不懂 | |
--with-xxx / --without-xxx | 不懂 | |
--build=arm-linux //设置编译环境 | 国产arm机器需要设置平台环境,不然会configure失败,导致build.sh失败 | |
SQLITE3_CFLAGS=路径 |
不懂 | |
SQLITE3_LIBS=路径 -lsqlite3 |
不懂 | |
sh autogen.sh 或 autoreconf |
不懂,但是要安装autoconf全家桶,可以参考本人帖子。注释① | |
make -j8 | 编译 | |
make install | 安装 | |
移动OBJ文件 | 可选 | |
cp -f boost_install/lboost.a ../lib/linux/ | 将静态库文件移动到lib文件夹 | |
cp -rf boost_install/include ../ | 将include文件拷贝到src同级路径 | |
【完成】 |
注释①:报错处理集-CSDN博客
注释②:https://www.cnblogs.com/wangzy-Zj/p/17296118.html
Makefile的格式大概如下
CXXFLAGS= | 用于将.c或.cpp文件编译成.o文件,编译格式为 $(CXX) $(CXXFLAGS) $*.cpp -o $@ |
|
CXX= | CXX = 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、含义 | 码农家园
继续回顾流程,显示用各个开源库的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什么意思,未知,后面要了解下
5、这个shell脚本遇到一个新的写法
https://open.codehub.huawei.com/OpenSourceCenter/download.osgeo.org/LibTIFF_-_TIFF_Library_and_Utilities/files?ref=4.3.0&filePath=autogen.sh&isFile=true
#!/bin/sh
set -x
libtoolize --force --copy
aclocal -I ./m4
autoheader
automake --foreign --add-missing --copy
autoconf
# Get latest config.guess and config.sub from upstream master since
# these are often out of date.
for file in config.guess config.sub
do
echo "$0: getting $file..."
wget -q --timeout=5 -O config/$file.tmp \
"https://git.savannah.gnu.org/cgit/config.git/plain/${file}" \
&& mv config/$file.tmp config/$file \
&& chmod a+x config/$file
retval=$?
rm -f config/$file.tmp
test $retval -eq 0 || exit $retval
done
这里面有个循环。这个写法一开始没有看懂。是在下载两个文件。
这两个文件是【file in config.guess config.sub】
后来竟然还报了这样一个错误
undefined symbol: _ZN6google8protobuf8internal28init_protobuf_defaults_stateE
上百度查原因,查这个报错,但是几乎是一无所获。找了一下午也没有一个正规的说法和解释。有点放弃的感觉,然后就拖到第二天,别人问进度,进度为0。和习贺问了下,提到这个函数"init_protobuf_defaults_stateE"在代码中哪里。有点启发,我之前都没有查过这个函数在程序中的情况。然后就尝试着查了下。不查不知道,一查吓一跳。
自己使用的3.12.2版本protobuf代码
所以我用的版本根本就不对啊!!
需要换成程序对应的版本重新编译。从这件事来看,版本间的差异是挺大的,不能想当然的使用版本!
这次编好就部署成功啦。完结撒花!!
上面的是线下编译成功了,dragonCloud上适配就有问题了
报错1:syntax error: unexpected end of file
需要vim 一下你的文件,然后:set fileformat=unix,:wq保存即可。
dragonCloud上的问题主要就是因为proj没有编译好,在gdal编译时被检测出来了,导致gdal没有编译成功,有报错提示:
checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... no
现在的问题就是proj为啥没有编译成功,proj中有个autoreconf指令,这个指令没用过
Linux下autoreconf,configure,make使用_bin_programs-CSDN博客
proj源码对应git上应该是:https://github.com/OSGeo/PROJ/tree/7.2
2023年12月20日16:51:12
一直都在报:
[2023/12/18 14:20:46.020 GMT+08:00] checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... no
[2023/12/18 14:20:46.020 GMT+08:00] checking for internal_proj_create_from_wkt in -lproj... no
[2023/12/18 14:20:46.020 GMT+08:00] checking for internal_proj_create_from_wkt in -linternalproj... no
[2023/12/18 14:20:46.021 GMT+08:00] configure: error: PROJ 6 symbols not found
百度这个问题,查到下面的帖子
Ubuntu 18.04从源代码编译安装GDAL3.4.1_configure: error: proj 6 symbols not found-CSDN博客
查询一下proj版本号:linux - 检查版本/如果安装了 PROJ4 - IT工具网
帖子里查到这个指令:
pkg-config --modversion proj
现在查一下执行机的proj版本号。
2023年12月22日17:25:25
还是没有解决这个问题,人要麻了,试一下下面这个帖子
gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)_checking for proj >= 6 library... checking for pro-CSDN博客
2023年12月25日16:36:43
现在还是没有解决这个问题啊,就是我现在还是没有解决arm编译报错的问题。
至于这个报错:
checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... no
已经解决了,按照这个帖子解决掉的:
linux 环境 postgresql + postgis 安装_linux上安装postgis-CSDN博客
在gdal的configure增加./configure --prefix=/usr/local/gdal --with-proj=/usr/local/proj/即可。
checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... yes
但是实际上,这个编程yes还是编译报错,继续处理。
报
configure: proj.h not found
又回到这个问题,我现在又在看这个提示,x86上没有这个提示,我又百度这个提示
报错①
[2023/12/25 18:20:01.335 GMT+08:00] ----------------------------------------------------------------------
[2023/12/25 18:20:01.336 GMT+08:00] Libraries have been installed in:
[2023/12/25 18:20:01.336 GMT+08:00] ***//Studio_Complier/3rd/gdal/src/libproj/lib
[2023/12/25 18:20:01.336 GMT+08:00]
[2023/12/25 18:20:01.336 GMT+08:00] If you ever happen to want to link against installed libraries
[2023/12/25 18:20:01.336 GMT+08:00] in a given directory, LIBDIR, you must either use libtool, and
[2023/12/25 18:20:01.336 GMT+08:00] specify the full pathname of the library, or use the '-LLIBDIR'
[2023/12/25 18:20:01.336 GMT+08:00] flag during linking and do at least one of the following:
[2023/12/25 18:20:01.336 GMT+08:00] - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
[2023/12/25 18:20:01.336 GMT+08:00] during execution
[2023/12/25 18:20:01.336 GMT+08:00] - add LIBDIR to the 'LD_RUN_PATH' environment variable
[2023/12/25 18:20:01.336 GMT+08:00] during linking
[2023/12/25 18:20:01.336 GMT+08:00] - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
[2023/12/25 18:20:01.336 GMT+08:00] - have your system administrator add LIBDIR to '/etc/ld.so.conf'
[2023/12/25 18:20:01.336 GMT+08:00]
[2023/12/25 18:20:01.336 GMT+08:00] See any operating system documentation about shared libraries for
[2023/12/25 18:20:01.336 GMT+08:00] more information, such as the ld(1) and ld.so(8) manual pages.
[2023/12/25 18:20:01.336 GMT+08:00] ----------------------------------------------------------------------
add LIBDIR to the 'LD_LIBRARY_PATH' environment variable during execution
百度到这个帖子:
linux pip3使用清华源_CentOS上安装Python3及pip3,代码的版本升级,安装sqlite3,MongoDB安装...-CSDN博客
其中还提到到执行添加环境变量:export LD_LIBRARY_PATH=/opt/sqlite3后,怎样去验证是否成功,使用/opt/sqlite3/bin/sqlite3这个指令。
感觉吧geos也EXPORT一下吧。
然后看日志,发现有很多报错①。日志里还有这个错误:
configure: error: GEOS support explicitly enabled, but geos-config could not be found
上面这个问题是因为我在
--with-geos=${PREFIX_INC_PATH}/libgeos/bin/geos-config \
下面增加了一行
--with-geos=${PREFIX_INC_PATH}/libgeos/lib \
本意是因为找不到so文件,解决这个问题
/usr/bin/ld: warning: libgeos_c.so.1, needed by ***//Studio_Complier/3rd/gdal/src/gdal/gdal/libgdal.so, not found (try using -rpath or -rpath-link)
加上了一行,但是不能这么加。
下面还是解决上面这个报错,百度说是没有链接so, 其中一个解决办法是EXPORT方法。
EXPORT方法的帖子:Linux系统中添加库文件路径的方法_linux添加库路径-CSDN博客
但是我竟然格式写错了。这个问题还是因为我把脚本里的语句放在linux上执行才报出来的。我还一直一维设置成功了呢。
报错如下:
export: `=': not a valid identifier
这才发现自己加了空格:百度能查到原因
-bash: export: `=': not a valid identifier-CSDN博客
修改再跑一次看看。哦对了,很多帖子说执行EXPORT之后还要执行ldconfig
实际报错没有权限
ldconfig: Warning: ignoring configuration file that cannot be opened: /etc/ld.so.conf.d/python3.conf: Permission denied
下面这个帖子讲的LD_LIBRARY_PATH我看懂了:
LD_LIBRARY_PATH详解-CSDN博客
现在配了环境变量就好了!!!
我靠,弄了这么久,猪呢是难者不会会者不难啊!
其实问题一开始就表现的很清楚,但是奈何我没有搞过啊。其实问题一开始就写出来了,就是报错①指向的提示,但是我一直纠结为啥x86可以编译成功,但是arm咋就不行呢。然后绕了很多路啊!
其实一开始看到这个提示就着重处理这个就可以了,唉!
这整个过程中,是把--prefix=弄的明明白白了,另外还有就是动态库环境配置的问题也搞清楚了。
最后解决方法就是把geos和proj增加环境变量配置。
export LD_LIBARAY_PATH=${PREFIX_INC_PATH}/libgeos/lib:$LD_LIBARAY_PATH
和
export LD_LIBRARY_PATH=${PREFIX_INC_PATH}/libproj/lib:$LD_LIBRARY_PATH
终于完结了啊。前前后后从开始处理到解决好,从20号到26号,但是感觉就度日如年啊!
里面还有一个坑,就是上面两个语句还不能随意加,要注意路径,毕竟${PREFIX_INC_PATH}是获取当前路径。
这边还有一个坑,就是只加上上面两条语句还是会报错
checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... yes
解决办法就是加上--with-proj=
也就是这个帖子linux 环境 postgresql + postgis 安装_linux上安装postgis-CSDN博客
哈哈,你以为结束了吗,并没有,后面适配我想要通过脚本自动获取到系统信息,然后适配流水线。竟然被我找到了方法
#!/bin/bash
os_info=$(uname -m)
echo "$os_info"
if echo "$os_info" | grep -q "arch"; then
echo "包含arch"
else
echo "不包含子arch字符串"
fi
同时根据系统信息适配文件创建
#!/bin/bash
os_info=$(uname -m)
echo "$os_info"
CURRENT_PATH=$(dirname $(readlink -f "$0"))
if echo "$os_info" | grep -q "arch"; then
LIB_PATH=${CURRENT_PATH}/studio_compile/lib_arm
echo "包含arch"
else
LIB_PATH=${CURRENT_PATH}/studio_compile/lib
echo "不包含子arch字符串"
fi
mkdir -p ${LIB_PATH}
cp ./*.txt ${LIB_PATH}
经验证可行。
Makefile获取系统信息:Makefile 零基础学习笔记:运行 shell 命令_makefile运行sh脚本-CSDN博客
写了如下的Makefile文件
SUBARCH := $(shell uname -m)
INFO := $(shell uname -o)
var :=arch
var1 := $(var)
all:
@echo $(SUBARCH)
@echo $(INFO)
ifeq ($(findstring arch, $(SUBARCH)), arch)
@echo "arm系统"
else
@echo "其他系统"
endif
Makefile格式不对报错:
missing separator (did you mean TAB instead of 8 spaces?). Stop
Linux中将tab与空格互换_linux将空格替换为tab-CSDN博客
报错:Syntax error: word unexpected (expecting ")")
解决办法Syntax error: word unexpected (expecting ")")错误的解决方法-CSDN博客
修改成这样就可以执行了
SUBARCH := $(shell uname -m)
INFO := $(shell uname -o)
var :=arch
var1 := $(var)
all:
@echo $(SUBARCH)
@echo $(INFO)
ifeq ($(findstring arch, $(SUBARCH)), arch)
@echo "arm系统"
else
@echo "其他系统"
endif
在x86和arm上验证成功
对整个编译过程进行了总结,是有意义的,编成功了。但是经验不复用应该是不好的,需要把经验积累下来。突然想起来强哥之前一直说要经验复用,大概也是指的这个意思吧。