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
第一次编译后提示缺少依赖包。提示如下图:
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'未定义的引用
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多个依赖包的版本是否一致。