GCC l選項 手動新增鏈結庫

2021-10-08 14:00:35 字數 3353 閱讀 2229

最近研究c語言crc迴圈冗餘校驗,找到乙個開源的庫:

lammertb/libcrc

其中有例項**,但是無論如何執行不起來,報錯如下:

[root@frytea-dev-test examples]# gcc tstcrc.c -o tstcrc -l ~/libcrc/include

/tmp/ccecajcy.o: in function `main':

tstcrc.c:(.text+0x2db): undefined reference to `update_crc_16'

tstcrc.c:(.text+0x2f6): undefined reference to `update_crc_16'

tstcrc.c:(.text+0x311): undefined reference to `update_crc_dnp'

tstcrc.c:(.text+0x330): undefined reference to `update_crc_sick'

tstcrc.c:(.text+0x34b): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x366): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x381): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x39c): undefined reference to `update_crc_kermit'

tstcrc.c:(.text+0x3b6): undefined reference to `update_crc_32'

tstcrc.c:(.text+0x42c): undefined reference to `update_crc_16'

tstcrc.c:(.text+0x441): undefined reference to `update_crc_16'

tstcrc.c:(.text+0x456): undefined reference to `update_crc_dnp'

tstcrc.c:(.text+0x46f): undefined reference to `update_crc_sick'

tstcrc.c:(.text+0x484): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x499): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x4ae): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x4c3): undefined reference to `update_crc_kermit'

tstcrc.c:(.text+0x4d7): undefined reference to `update_crc_32'

tstcrc.c:(.text+0x53d): undefined reference to `update_crc_16'

tstcrc.c:(.text+0x554): undefined reference to `update_crc_16'

tstcrc.c:(.text+0x56b): undefined reference to `update_crc_dnp'

tstcrc.c:(.text+0x586): undefined reference to `update_crc_sick'

tstcrc.c:(.text+0x59d): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x5b4): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x5cb): undefined reference to `update_crc_ccitt'

tstcrc.c:(.text+0x5e2): undefined reference to `update_crc_kermit'

tstcrc.c:(.text+0x5f8): undefined reference to `update_crc_32'

collect2: error: ld returned 1 exit status

排查原因後發現是庫沒有連線,需要手動連線倉庫下lib資料夾中的libcrc.a檔案,執行如下編印命令成功編譯:

gcc tstcrc.c -o tstcrc /root/libcrc/lib/libcrc.a
使用gcc究竟如何手動連線庫呢,找到了一篇文章:

下面簡單記錄:

標準庫的大部分函式通常放在檔案 libc.a 中(檔名字尾.a代表「achieve」,譯為「獲取」),或者放在用於共享的動態鏈結檔案 libc.so 中(檔名字尾.so代表「share object」,譯為「共享物件」)。這些鏈結庫一般位於 /lib/ 或 /usr/lib/,或者位於gcc預設搜尋的其他目錄。

當使用gcc編譯和鏈結程式時,gcc缺省會鏈結libc.a或者libc.so,但是對於其他的庫(例如非標準庫、第三方庫等),就需要手動新增。

gcc 的-l選項(小寫的 l)可以讓我們手動新增鏈結庫。

鏈結庫的組成是怎樣呢?以數學庫為例,數學庫的檔名是libm.a。字首lib和字尾.a是標準的,m是基本名稱,gcc 會在-l選項後緊跟著的基本名稱的基礎上自動新增這些字首、字尾,s數學庫中,基本名稱為m

如多要連線其他目錄中的庫怎麼辦呢?

1) 把鏈結庫作為一般的目標檔案,為 gcc 指定該鏈結庫的完整路徑與檔名。

[root@bogon demo]# gcc main.c -o main.out /usr/lib/libm.a

[root@bogon demo]# gcc main.c -o main.out -l/usr/lib -lm
可以使用多個-l選項,或者在乙個-l選項內使用冒號分割的路徑列表。

3) 把包括所需鏈結庫的目錄加到環境變數librarypath中。

GCC l選項 手動新增鏈結庫

鏈結器把多個二進位制的目標檔案 object file 鏈結成乙個單獨的可執行檔案。在鏈結過程中,它必須把符號 變數名 函式名等一些列識別符號 用對應的資料的記憶體位址 變數位址 函式位址等 替代,以完成程式中多個模組的外部引用。而且,鏈結器也必須將程式中所用到的所有c標準庫函式加入其中。對於鏈結器...

手動載入動態鏈結庫

手動載入動態鏈結庫常用於外掛程式式架構開發 dlfcn.h標頭檔案提供了api 以下我們給出常用的4個函式 open the shared object file and map it in return a handle that can be passed to dlsym to get sym...

cmake新增動態鏈結庫

如果使用gcc進行單個c檔案編譯的時候,有時候後面會需要新增如 l l之類的引數,如下 gcc o test test.c l usr local lib lopencv 這裡 l是制定動態庫的位置,l則是指定打算連線的動態庫名字。那麼在進行專案編譯的時候就需要通過cmake來通過cmakelist...