Linux 相關編譯知識
一直對編譯的過程概念很模糊,總結記錄一下方便以後復習。
Linux下gcc編譯器使用:
gcc編譯流程:
1、預處理 gcc -E hello.c -o hello.i 對包含的頭文件和宏定義進行處理 2、編譯 gcc -s hello.i -o hello.s 檢查代碼的規範性,是否有語法錯誤,把代碼翻譯成匯編語言 3、匯編 gcc -c hello.s -o hello.o 匯編語言轉成二進制目標代碼 4、鏈接 gcc hello.o -o hello |
上述流程中的第四步鏈接階段,涉及到一個概念:函數庫
函數庫分為靜態庫和動態庫兩種。靜態庫是指編譯鏈接時,將庫文件的代碼全部加入可執行文件中,因此生成的文件較大,但是在運行時不再需要庫文件,
其後綴名為“.a”。動態庫是在程序執行的時候加載庫,這樣可以節省開銷,後綴名為".so"。
靜態庫:
靜態庫的生成及使用: 1、生成.o文件 gcc -c hello.c 2、制作靜態庫 ar rcsv libhello.a hello.o ar:歸檔工具,將hello.o歸檔成靜態庫 3、鏈接靜態庫 gcc -o hello_test hello_test.c -L. -lhello -L dir:在庫文件的搜索路徑列表中添加dir目錄; -lname: 指示編譯時鏈接到庫文件libname.a或者libname.so |
動態庫:
動態庫的生成及使用: 1、生成.o文件 gcc -fPIC -c hello.c -fPIC:創建位置無關目標代碼 2、制作動態庫 gcc -shared -o libhello.so hello.o -share:生成動態文件 3、鏈接動態庫 gcc -o hello_test hello_test.c -L. -lhello |
運行可執行程序之前,需要註冊動態庫的路徑名,註冊的幾個方法:
1、修改/etc/ld.so.conf文件 2、修改LD_LIBRARY_PATH環境變量 3、將庫文件直接復制到/lib或者/usr/lib目錄下(這兩個目錄是系統的默認的庫路徑名) 列:cp libhello.so /lib |
關於-fPIC的詳細解釋可以到這個博主的文章鏈接查看:
http://blog.sina.com.cn/s/blog_54f82cc201011op1.html#cmt_57E8BB9B-7F000001-5E601934-7D9-8A0
Linux 相關編譯知識