最近研究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...