GCC 編譯動態庫 so檔案時,靜態連結libmysqlclient.a 與動態連結引數一起使用問題。
直接放結論, 下面是編譯一個使用了mysql C API 的 mysql.so 檔案(我們的業務中,它是zbx加裁的modules so檔案)
gcc -fPIC -shared -o mysql.so mysql.c \
-I/usr/include/mysql \
-L/usr/lib64/mysql \
-Wl,-Bstatic -lmysqlclient \
-Wl,-Wl,-Bdynamic -lssl -lgcc_s -lm -lrt
解釋:
- -fPIC -shared 引數 一般是一起使用使用,編譯so檔案用,其不能直接與 -static 引數混用。
- -Wl,-Bstatic
- -Wl,-Bdynamic 同理,後續的-l 就是動態連結。
排查方法:
- 先使用全動態編譯編譯出所需要 的so檔案,使用ldd命令檢視其依賴了哪些動態庫(與路徑)。
- 由於 libmysqlclient_xx.so 中的經常有版本號(5.6=18, 5.7=20)問題,所以使用靜態連結能免除此問題。
- 沒版本問題與路徑不一致問題的的so依賴檔案,就可以使用動態連結。
相關推薦
GCC 編譯動態庫 so檔案時,靜態連結libmysqlclient.a 與動態連結引數一起使用問題。
直接放結論, 下面是編譯一個使用了mysql C API 的 mysql.so 檔案(我們的業務中,它是zbx加裁的modules so檔案) gcc -fPIC -shared -o mysql.so mysql.c \ -I/usr/include
Linux下.h與動態庫.so檔案的路徑新增及gcc編譯的記錄
使用場景 當你在程式中加入一個非gcc預設搜尋路徑上的一個.h標頭檔案時,會報錯“No such file”,當你的程式需要動態連結一個.so庫時,在預設路徑裡找不到該庫,也會報錯。那麼,如何解決這兩種問題呢? gcc編譯使用“-I”選項 當頭檔案非標
linux關於執行編譯後命令找不到動態庫.so檔案的解決辦法。
方法一:(沒有root許可權)利用find找到報錯動態庫檔案目錄lib路徑,vim /home/xxx/.bashrc 新增一行: export LD_LIBRARY_PATH=動態庫/lib:$LD_LIBRARY_PATH 然後 source /home/xxx/.bashrc
單目跟蹤位姿產品研發(二)----在linux下將c++工程打包成動態庫so檔案API
單目跟蹤位姿專案由對方公司提供應用場景,我方研發核心演算法,通過c++實現功能,然後對方公司通過java\js來開發炫酷的介面,共同合作完成,最終對方公司負責銷售推廣,推向市場。因此,涉及到java介面呼叫c++核心程式碼的問題。 現記錄
linux下靜態庫.a和動態庫.so檔案的生成和使用
1.靜態庫是一些目標檔案(字尾名為.o)的集合體而已。 2.靜態庫的字尾名是.a,對應於windows作業系統的字尾名為.lib的靜態庫。 3.可以使用ar命令來建立一個靜態庫檔案。 來看一個例項,根據書中的程式碼簡化的,先看一看可以編譯成庫檔案的原始檔中的程式碼: /* test.c */ i
Android Studio打包APK後動態庫so檔案被改動
本人專案中遇到一個非常奇葩的問題,百思不得其解。 問題是這樣的: 由於專案是將C/C++層的程式碼與java程式碼分開管理的,所以C/C++程式碼沒有放進AS裡,編譯時將在linux下編譯好的動態庫直接放進AS工程的jniLibs下再打包生成APK。問題來了。 AS 打包A
linux 呼叫動態庫so檔案
關於動態呼叫動態庫方法說明 一、 動態庫概述 1、 動態庫的概念 日常程式設計中,常有一些函式不需要進行編譯或者可以在多個檔案中使用(如資料庫輸入/輸出操作或螢幕控制等標準任務函式)。可以事先對這些函式進行編譯,然後將它們放置在一些特殊的目的碼檔
執行so檔案時,出現error while loading shared libraries: libjvm.so: cannot open shared object file...
出現:error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directoryI don't get the errors you
linux下gcc編譯 .c檔案生成動態連結庫 .so檔案,並測試呼叫該連結庫
簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc
c編譯,呼叫動態連線庫 (.so檔案)
c編譯,呼叫動態連線庫 (.so檔案) C編譯: 動態連線庫 (.so檔案) Linux動態連結庫.so檔案的命名及用途總結 Linux程式設計練習(二)—— Linux下.so動態庫的建立和呼叫 在“紙上談兵: 演算法與資料結構”中,我在每一篇都會有一個C程式,用於實現演算法和資料
Linux下gcc編譯生成動態連結庫*.so檔案並呼叫它
動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。1、動態庫的編譯下面通過一個例子來介紹如何生成一個動態庫。這裡
GCC編譯生成動態連結庫*.so檔案
動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。 1、動態庫的編譯 下面通過一個例子來介紹如何生成一個動態庫。
linux動態庫so呼叫外部so,執行時出現undefined symbol
1、首先排查,C++呼叫了c的庫?是不是需要加上extern "c",尤其是類的動態庫,需要用到工廠模式,create一個物件出來,該工廠函式需要extern "c"宣告。 extern "C" CDbBase* create(); extern "C" void dest
Android Cocos2dx引擎 prv.ccz/plist/so等優化快取檔案,手把手ida教你逆向工程反編譯apk庫等檔案
前段時間在 Android play 上看到一個很牛逼的 3D 動態天氣預報,效果真的很炫,二話不說動手 dex2jar.bat/apktool 發現這並沒 有什麼卵用,在核心的地方看見 native
JAVA呼叫動態連結庫so檔案
最近專案在用到openjdk1.8時,出現以下異常,綜其原因是JDK1.8中libjavajpeg.so估計缺少某些函式。 記錄一下,這裡有一篇關於動態連結庫的文章,比較不錯,轉載推薦一下:http://www.cnblogs.com/duanxz/p/3651347.html Exception in t
在當java有多個jar包和多個檔案時,如何在控制檯編譯執行
編譯 javac -cp .:/root/java/hash2/lib/mysql-connector-java-5.1.35-bin.jar:/root/java/hash2/lib/c3p0-0.9.1.1.jar *.java 執行 java -cp .:
通過gcc建立靜態庫.a、動態庫.so及其使用
gcc的常用選項 -v:檢視gcc版本 -c:只編譯,生成.o檔案,不進行連結 -g:包含除錯資訊,方便使用gdb除錯 -D:編譯時定義巨集 靜態庫的建立和使用 這裡使用命令ar,常用的選項是: -r:替換歸檔中已有的檔案或加入新檔案 -t:顯示歸檔檔
QT生成動態連結庫.so檔案
首先是新建一個工程,選擇C++庫,開啟後是這樣的: 然後輸入新建的名稱,下一步,記得勾選Qtcore那個(就是預設的那個),否則編譯似乎不能通過。因為後面自動生成的.h檔案裡還有這個。 自動生成的有4個檔案一個pro,一個cpp,一個XXX.h檔案,一個XXX_g
linux下檢視動態連結庫so檔案的依賴的相關組建
我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。 windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。 但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易
linux下檢視動態連結庫so檔案的依賴的相關元件
我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。 windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。 但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支