mysql.h 动态编译命令_Linux环境编译动态库和静态库总结
對(duì)Linux環(huán)境動(dòng)態(tài)庫和靜態(tài)庫的一些基礎(chǔ)知識(shí)做一些總結(jié),
首先總結(jié)靜態(tài)庫的編譯步驟。
1 先基于.cpp或者.c文件生成對(duì)應(yīng)的.o文件
2將幾個(gè).o文件 使用ar -cr命令 生成libname.a文件
libname.a 為靜態(tài)庫, name 為靜態(tài)庫的名字,
可以根據(jù)模塊功能命名。
舉個(gè)例子
在當(dāng)前目錄下,有一個(gè)mymethod.h文件
在mymethod.cpp里實(shí)現(xiàn)這兩個(gè)函數(shù)
在當(dāng)前目錄下有一個(gè)main.cpp文件
為了方便使用,將mymethod.cpp封裝成靜態(tài)庫和動(dòng)態(tài)庫
首先將mymethod.cpp 編譯成目標(biāo)文件
g++ -c mymethod.cpp -o mymethod.o
然后根據(jù)目標(biāo)文件生成靜態(tài)庫
ar -cr libmymethod.a mymethod.o
ar命令可以用來創(chuàng)建、修改庫,也可以從庫中提出單個(gè)模塊
-c 選項(xiàng)表示 創(chuàng)建一個(gè)庫。不管庫是否存在,都將創(chuàng)建
-r 選項(xiàng)表示 將模塊插入庫,如果庫中有對(duì)應(yīng)的模塊,那么進(jìn)行更新
如果把多個(gè).o文件插入庫.a里,只需要在后面用空格分開寫出來
格式
ar -cr 靜態(tài)庫libname.a ?name1.o name2.o
靜態(tài)庫的命名有規(guī)則,格式為lib+庫名+.a
生成靜態(tài)庫libmymethod.a后,
編譯main.cpp 連接靜態(tài)庫生成可執(zhí)行文件main
g++ main.cpp -o main -I ./ -L ./ -lmymethod
-I選項(xiàng)表示頭文件路徑
-L表示靜態(tài)庫或者動(dòng)態(tài)庫的路徑
鏈接靜態(tài)庫寫成 -l庫名即可:-lmymethod
運(yùn)行./main 可以輸出結(jié)果
下面是動(dòng)態(tài)庫的編譯
動(dòng)態(tài)庫的命名是lib+庫名+.so
動(dòng)態(tài)庫需要使用-shared 選項(xiàng)以及-fPIC選項(xiàng)
g++ -c -fPIC mymethod.cpp -o mymethod.o
-fPIC表示代碼是和地址無關(guān)的,不需要被不同模塊重定位
然后根據(jù)目標(biāo)文件生成動(dòng)態(tài)庫.so文件
g++ -shared -o libmymethodso.so mymethod.o
-shared 選項(xiàng)表示生成的是.so動(dòng)態(tài)庫文件
下一步是鏈接動(dòng)態(tài)庫
g++ main.cpp -o main -I ./ -L ./ -lmymethodso
此時(shí)不能直接運(yùn)行./main否則會(huì)提示找不到對(duì)應(yīng)的動(dòng)態(tài)庫
上面的步驟可以直接寫成一句話
g++ -shared -fPIC mymethod.cpp -o libmymethodso.so
我們現(xiàn)在有幾種方式配置動(dòng)態(tài)庫的路徑
第一種
export LD_LIBRARY_PATH="./:$LD_LIBRARY_PATH"
這種方式將動(dòng)態(tài)庫路徑配置到LD_LIBRARY_PATH,只是暫時(shí)生效
第二種
使用 ldconfig 機(jī)制(需 root 權(quán)限):
● 首先,在 /etc/ld.so.conf.d/ 下創(chuàng)建一個(gè) .conf 文件,
如 libmymethod.conf ,內(nèi)容為共享庫所在目錄的絕對(duì)路徑
● 然后,運(yùn)行 ldconfig
第一種比較簡單,配置好后可以直接運(yùn)行./main
第二種按照操作進(jìn)入/etc/ld.so.conf.d/,
然后創(chuàng)建mymethod.conf
用vi打開mymethod.conf,添加動(dòng)態(tài)庫的絕對(duì)路徑
/home/secondtonone/soando
最后運(yùn)行l(wèi)dconfig, 即可生效了。
這樣就可以運(yùn)行./main
現(xiàn)在對(duì)動(dòng)態(tài)庫路徑配置做一個(gè)總結(jié)
解決共享庫路徑問題
gcc/g++ 編譯期 :
● 使用 -L 選項(xiàng)指定所需鏈接的共享庫所在目錄(如果共享庫或其連
接文件位于 /usr/lib 、 /usr/local/lib 或由 LD_LIBRARY_PATH 指定
的目錄下,則不需指定該選項(xiàng))
● 使用 -l 選項(xiàng)指定所需鏈接的共享庫名稱(無前綴、后綴)
程序運(yùn)行期:
● 使用 LD_LIBRARY_PATH 環(huán)境變量來指定所需引用的共享庫所在
目錄 ( 臨時(shí)指定或永久性寫入相關(guān)文件,普遍適用于 UNIX 世界 )
● 使用 ldconfig 機(jī)制(需 root 權(quán)限):
● 首先,在 /etc/ld.so.conf.d/ 下創(chuàng)建一個(gè) .conf 文件,
如 libmymethod.conf ,內(nèi)容為共享庫所在目錄的絕對(duì)路徑
● 然后,運(yùn)行 ldconfig
我的公眾號(hào),謝謝關(guān)注下。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql.h 动态编译命令_Linux环境编译动态库和静态库总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钢铁怪兽是无限火力吗
- 下一篇: 部队想自杀人员如何管控