アーチ

アーチ

makefileに付属していない限り、サンプル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を開き、リンカーフラグを見つけて、それを私のコンパイルコマンドにコピーし、コンパイルされている最小のセットが見つかるまでフラグを削除し続けました。

非効率的で退屈でより良い方法があると思います。

ベストアンサー1

問題は、ソースファイルを調べて、使用するリンカフラグを決定する方法です。以下の例は Debian 用です。ここで注目すべき関連項目はヘッダファイルです。

したがって、ヘッダファイルを含むCソースファイルがあるとします。

#include <X11/extensions/XInput.h>.

XInput.hたとえばapt-file、このヘッダーファイルがインストールされているパッケージに含まれていることがわかっている場合は、検索することもできます。例えばdpkg -Sdlocate

apt-file search XInput.h
libxi-dev: /usr/include/X11/extensions/XInput.h

これは、ヘッダファイルがlibxiの開発パッケージ(Cライブラリの場合は開発パッケージ(通常libname-devまたは形式libname-devel)にヘッダファイルが含まれている)に属するため、-lxiリンカフラグを使用する必要があることを示します。

同様のアプローチが、パッケージ管理システムを使用するすべての展開に適用されます。

おすすめ記事