C++ 调用三方so库遇到的各种问题

C++ 调用so库

最近接了一个需求,在我们的业务中调用第三方.so库。

在JAVA代码中通过jni调用时总是报错无法完成初始化。

于是自己写了一个c++的demo,通过自己的demo来发现问题出在哪里。

demo很简单,贴下源码:main.cpp

extern "C" void TKW_Hello();

int main(){
	TKW_Hello();
	return 0;
}

TKW_Hello();为三方.so库提供一个方法,其实三方库提供了很多方法,我先只验证一个方法。

1.1、编译C++命令

编译命令:

g++ main.cpp libTKW_API.so -o main -pthread -lz

遇到的问题主要分为两类根据不同的提示,看1.2和1.3。

注:

  • libTKW_API.so 为第三方提供的资源。

  • pthread和-lz为了依赖系统资源,不用从当前目录加载。

  • 其实参数-pthread -lz也是遇到的问题,加上后就可以解决问题。

1.2、缺少依赖包 error while loading shared libraries: libmpfr.so.4:cannot open shared object file:No such file or directory

第一次编译后提示缺少依赖包。提示如下图:

image

1.2.1、通过命令查找所在安装包

命令

yum whatprovides libmpfr.so.4

1.2.2、下载安装包

通过官网下载缺省的包:mpfr-3.1.1-4.el7.i686

官网地址:https://vault.centos.org/7.5.1804/os/x86_64/Packages/

注意不同的系统版本官网地址不一样,根据自身系统的版本查询相应的地址。

注:下载时还要是根据应用的服务器下载对应的版本。

1.2.3、安装安装包

将下载的安装包上传到内网服务器上目录中(我的目录在software)。

在文件所在目录执行安装命令:

rpm -Uvh *.rpm --nodeps --force

安装完成后再次执行我们的编译命令,发现提示信息已经变了,说明我们安装类库成功。再根据提示解决相关的问题。

1.2.4、总结

遇到这么多依赖包的问题,其实就是gcc相关依赖包未安装全的导致的。可以批量下载安装。

1.3、错误:对'gzopen'未定义的引用

image

1.3.1、在线安装zlib

wget http://zlib.net/zlib-1.2.11.tar.gz
tar zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11.tar.gz
./configure
make
make install

# 覆盖原版本,可以先备份一下原版本
cp /usr/local/lib/libz.so.1 /lib/

在安装zlib时也可能会报各种各样的错误,解决问题主要有两点:

  • 是安装包是否统一为32位或者64位。
  • gcc多个依赖包的版本是否一致。
原文地址:https://www.cnblogs.com/pengei/p/14760525.html