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多個依賴包的版本是否一致。
