gcc/g++的編譯參數,這里只介紹 -L 、-l、-include、-I、-shared、-fPIC
-L :表示要鏈接的庫所在的目錄。-L. 表示要鏈接的庫在當前目錄, -L/usr/lib 表示要連接的庫在/usr/lib下。目錄在/usr/lib時,系統會自動搜索這個目錄,可以不用指明。
-l (L的小寫):表示需要鏈接庫的名稱,注意不是庫文件名稱,比如庫文件為 libtest.so,那么庫名稱為test
-include :包含頭文件,這個很少用,因為一般情況下在源碼中,都有指定頭文件。
-I (i 的大寫):指定頭文件的所在的目錄,可以使用相對路徑。
-shared :指定生成動態鏈接庫
-fPIC: 表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時事通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼共享的目的。
生成鏈接庫
第1步,生成目標文件:g++ -c xxx.cpp
第2步,創建靜態鏈接庫: ar cqs libxxxx.a xx1.o xx2.o xx3.o (參數選項請看【5】)
第3步,程序中使用靜態鏈接庫
第4步,創建動態鏈接庫 g++ -fPIC -shared -o libxxx.so xx1.cpp xx2.cpp xx3.cpp
第5步,動態鏈接庫使用
庫的鏈接,上面簡單演示了一遍庫的生成過程,但是還有很多細節沒有講清楚。以下問題需要注意:
1. 鏈接過程中可能出現多種鏈接方式,需要使用一些參數來指定,下面只是一個演示,在測試時,自己填寫具體的名稱
[plain] view plain copy
- g++ testmain.o -o testmain -WI,-Bstatic -lstaticlib -WI,-Bdynamic -ldynamiclib
2. 鏈接過程中同一個庫(名稱相同)的靜態和動態兩種鏈接庫,在鏈接過程中,系統優先選擇動態鏈接庫
3. 動態鏈接庫路徑,系統默認在/usr/lib 和/usr/local/lib兩個庫目錄搜索,自己定義的庫需要格外指定路徑(設定變量LD_LIABRARY_PATH)或者將其拷貝到這兩個目錄下,在上面的例子的測試過程,已經有說明。當然也可以將當前路徑添加到/etc/ld.so.conf文件中或者/etc/ld.so.conf.d目錄下的一個文件中。
4. 查看動態鏈接庫。有時候可能需要查看一個庫中到底有哪些函數,nm命令可以打印出庫中的涉及到的所有符號。庫既可以是靜態的也可以是動態的。nm列出的符號有很多,常見的有三種:
一種是在庫中被調用,但並沒有在庫中定義(表明需要其他庫支持),用U表示;
一種是在庫中定義的函數,用T表示,這是最常見的;
另一種所謂的“弱態”符號,它們雖然在庫中定義,但可能被其他庫中的同名符號覆蓋,用W表示。
使用ldd命令可以查看程序的庫依賴: