1. 程式人生 > >Linux 相關編譯知識

Linux 相關編譯知識

rar body 二進制 red libname 需要 列表 ext sina

  一直對編譯的過程概念很模糊,總結記錄一下方便以後復習。

  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 相關編譯知識