1、編譯過程
gcc –fPIC –c xxx.c
其中-fPIC是通知gcc編譯器產生位置獨立的目標代碼。鏈接的時候不通過拷貝來進行。
2、鏈接過程
gcc –shared –o libxxx.so xxx.o
經過編譯鏈接就可以生成動態鏈接庫,其擴展名為.so
Eg.
還可以gcc –fPIC –shared -o libhello.so hello.c
舉個例子:
//Hello.h
//hello.c
//main.c
先生成動態鏈接庫
然後編譯鏈接main.c
但是把-lhello放在文件名後面就沒有問題了,並生成了一個main執行文件:
運行執行文件的時候出現了以下問題:
原因可能是程序運行時並不知道動態庫所在的路徑,因此自然未找到。
解決方法:
拷貝動態鏈接庫到系統共享目錄下,或在系統共享目錄下為該動態鏈接庫建立連接(硬連接或符號連接均可,常用符號連接)。
其中ldconfig是為了讓動態鏈接庫為系統所共享。
動態鏈接庫被系統所共享以後,再運行main,得到結果如下:
利用GCC編譯器生成靜態鏈接庫
用個例子來說明如何在gcc編譯器中生成靜態鏈接庫
//Hello.h
//hello.c
//main.c
首先gcc –c hello.c文件生成hello.o
然後利用hello.o生成靜態鏈接庫,利用
ar –rc –o libhello.a hello.o
或者利用 ar rcs –o libhello.a hello.o
然後利用靜態鏈接庫編譯鏈接main.c
Linux升級GCC 4.8.1清晰簡明教程(Ubuntu 12.04 64位版為例) http://www.linuxidc.com/Linux/2014-04/99583.htm
Ubuntu 14.04 LST安裝GCC 4.1.2 http://www.linuxidc.com/Linux/2016-06/132040.htm
Ubuntu下Vim+GCC+GDB安裝及使用 http://www.linuxidc.com/Linux/2013-01/78159.htm
Ubuntu下兩個GCC版本切換 http://www.linuxidc.com/Linux/2012-10/72284.htm
CentOS6.5升級手動安裝GCC4.8.2 http://www.linuxidc.com/Linux/2015-01/112595.htm
GCC 的詳細介紹:請點這裡