Compiling
如何找出使用給定 C 庫函式所需的連結器標誌?
執行範例 C 程式碼是一項痛苦的練習,除非它帶有生成文件。
我經常發現自己有一個 C 文件,其中包含的程式碼據說可以做一些很酷的事情,但是對於它的第一次基本編譯嘗試(
gcc main.c
)失敗了——main.c:(.text+0x1f): undefined reference to `XListInputDevices' clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation)
——或類似的。
我知道這意味著我缺少正確的連結器標誌,例如
-lX11
,-lXext
或-lpthread
.但哪些?
我目前處理這個問題的方法是找到包含函式的庫頭,使用 Github 的搜尋來找到導入相同頭的其他程序,打開它的 makefile,找到連結器標誌,將它們複製到我的編譯命令中,並繼續刪除標誌,直到我找到一個仍然可以編譯的最小集合。
這是低效的,無聊的,讓我覺得必須有更好的方法。
問題是如何通過檢查源文件來確定要使用的連結器標誌。下面的範例適用於 Debian。標頭檔是這裡要注意的相關項目。
所以,假設有一個包含標頭檔的 C 源文件
#include <X11/extensions/XInput.h>.
我們可以搜尋
XInput.h
使用,比如說apt-file
。如果您知道此標頭檔包含在已安裝的軟體包中,dpkg -S
或者dlocate
也可以使用。例如apt-file search XInput.h libxi-dev: /usr/include/X11/extensions/XInput.h
這告訴您此標頭檔屬於 libxi 的開發包(對於 C 庫,開發包(通常為
libname-dev
或形式libname-devel
)包含標頭檔),因此您應該使用-lxi
連結器標誌。類似的方法應該適用於任何帶有包管理系統的發行版。