linux下g++ 編譯時動態庫和靜態庫的鏈接和頭文件問題

轉自:https://blog.csdn.net/shitangdejiaozi/article/details/51028938


原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。

1.動態庫和靜態庫簡介

靜態庫在程序鏈接的時候會自動的鏈接到程序裏,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。 
動態庫在編譯時不會被連接到目標代碼中,而是在程序運行時才被載入,動態庫以.so結尾。 
靜態庫相對於動態庫來說更高的效率,但是消耗更多的空間。

2.動態庫的使用

Linux下,編譯時要搜索動態庫的路徑,查找順序爲: 
假設動態庫文件libmyfoo.so在目錄home/lib/mylib中。 
1,編譯目標代碼時指定的動態庫 搜索路徑 
g++ -o test test.cpp /home/lib/mylib/libmyfoo.so 
或者 g++ -o test test.cpp -L /home/lib/mylib/ -lmyfoo 
-l 和-L的意思在下面會具體解釋。 
2,環境變量LD_LIBRARY_PATH指定的動態庫搜索 
在即將運行編譯指令的終端下執行: 
export LD_LIBRARY_PATH=/home/lib/mylib 
然後再運行g++ -o test test.cpp -lmyfoo 
但是這種方法具有臨時性,當你關閉此終端,就失效了,我們可以在~/.bashrc 中加入:export LD_LIBRARY_PATH=$LD_LIBRARAY_PATH:/home/lib/mylib 
這樣每次打開終端都要進行配置。 
3,在/etc/ld.so.conf中指定動態庫路徑 
在文件中加入一行:/home/lib/mylib 將自己的目錄加入到系統的共享目錄中。然後ldconfig來刷新共享庫緩存。 
4,/lib 
把你的.so文件複製到/lib目錄下就能找到了 
5,/usr/lib 
上面是查找動態庫的順序,當然也是我們使用動態庫的方法,使用哪種都可以。 
對於靜態庫,使用第一種方法 
g++ -o test test.cpp /home/lib/mylib/libmyfoo.a 
或者 
g++ -o test test.cpp -L /home/lib/mylib -lmyfoo 
#### -l -L 的說明 
-l 參數就是用來指定程序要鏈接的庫,-l參數緊接着是庫名, 
庫名和庫文件名有什麼不同呢? 
庫文件名:libmyfoo.so 
庫名:myfoo 把庫文件名的頭lib和尾.so去掉就是庫名了 
放在/lib 和/usr/lib 和/usr/local/lib裏的庫直接用-l參數就能鏈接了,如果庫文件沒有在這三個目錄裏,就需要-L 比如上面的例子:g++ -o test test.cpp -L/home/lib/mylib -lmyfoo 
-L 後面跟的是庫文件所在目錄,再加上-l庫名

3.頭文件

/usr/include 目錄中的頭文件編譯器能夠自己知道,如果是其他目錄下,需要使用-I參數來指定頭文件目錄。 
g++ -o test test.cpp -I /myinclude 
你也可以在文件中 #include “myclude/test.h” 
以上這些在使用的使用最好是使用makefile文件,方便省事,不用每次都去添加參數。

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/shitangdejiaozi/article/details/51028938
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章