Linux下gcc编译依赖库可能出现的系列问题以及对应解决方法(以GDAL库为例)

Posted nanke_yh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下gcc编译依赖库可能出现的系列问题以及对应解决方法(以GDAL库为例)相关的知识,希望对你有一定的参考价值。

        使用C++开发的代码需要依赖gdal库,那么在linux下gcc编译工程需要将gdal库文件包含进去。在linux下编译gdal库,就需要在解压的gdal包路径下打开终端,并输入网上相关的编译命令咯。这些过程往往会出现各样的问题,下面将列出这些问题并给出相应的解决方法。

1、linux下按照正常编译步骤./configure后make完后,将libgdal.a文件拷贝到对应工程库目录下后,编译gcc工程出现链接生成自己的动态库时报错:libgdal.a(xxxx.o):relocation R_X86_64_32S against `a local symbol can not be used when making a shared object;recompile with -fPIC

问题1解决:在编译生成gdal.a库时,在./configure之前设置gcc,g++编译参数:

$ export CFLAGS="-fPIC"

$ export CXXFLAGS="-fPIC"

再./configure和make -j8,最后将libgdal.a拷贝到工程的lib下再编译工程链接自己的动态库。

        2、gdal库的编译,安装包解压后,进行编译,正常编译步骤./configure后make -j8即可。但是执行make出现一直重复configure运行结果信息

问题2解决:检索问题,找到https://blog.csdn.net/weixin_31885123/article/details/112836742,发现出现此类问题是linux系统时间错误导致的,所使用的台式机的确时间显示2013年2月13日。将其重新设置成正确时间后问题解决。

        3、在笔记本虚拟机上根据步骤将libgdal.a库添加工程后编译gcc,再去运行IDEA上的java程序报错提示:

引用的.so文件:undefined symbol: _ZN11xercesc_3_211InputSource11setEncodingEPKDs

笔记本虚拟机上版本信息:gdal2.4.3、IDEA2018.3.5、操作系统Ubuntu5.4.0、gcc7.5.0,多次生成.a文件均107M大小替换后运行均报错。

问题3解决:检索了问题,并没有较好的解决手段和方法,在搜到https://github.com/bvlc/caffe/issues/5984这个时,发现其中有人提到,是软件版本中依赖库存在冲突导致,降低版本即可。

        虽然我这边没有这样操作,但受这个启发查看了一下同样步骤和工程在干净的台式机上能够运行。且比对生成的libgdal.a文件大小也不一致,仅67.8M。为此将.a文件拷贝到笔记本上编译运行IDEA测试程序不再报错了。

台式机版本信息:gdal2.4.3、IDEA2020.1.1、操作系统Centos7 3.10.0、gcc4.8.5。

        之所以产生这样的错误,估计也还是笔记本虚拟机中存在库文件冲突地方,在多次编译均无果后,可以尝试换台机器(最好干净的)重新编译,查看生成的.a库文件大小是否一致。不一致则替换后进行尝试。有知道具体原因或其他更好解决方法的可在评论区中不吝赐教呀。

以上是关于Linux下gcc编译依赖库可能出现的系列问题以及对应解决方法(以GDAL库为例)的主要内容,如果未能解决你的问题,请参考以下文章

Linux动态库多重依赖,编译问题!!!!!!

我在linux环境下怎么就是编译不成功

GCC编译过程与动态链接库和静态链接库

linux下 gcc可以编译hello.c arm-linux-gcc 无法找到libz.so.1

gcc找不到静态库中的函数

linux下查看动态链接库so文件的依赖的相关组建