Compiling

如何找出使用給定 C 庫函式所需的連結器標誌?

  • June 11, 2020

執行範例 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連結器標誌。

類似的方法應該適用於任何帶有包管理系統的發行版。

引用自:https://unix.stackexchange.com/questions/277845