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の検索を使用して、同じヘッダーをインポートする他のプログラムを見つけ、そのメイクファイルを開き、リンカーフラグを見つけます。それらを私のコンパイルコマンドにコピーし、コンパイルできる最小限のセットが見つかるまでフラグを削除し続けます。
これは非効率的で退屈であり、より良い方法があるに違いないと私に感じさせます。
問題は、ソースファイルの検査から使用するリンカーフラグを決定する方法です。以下の例は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
リンカーフラグ。
同様の方法は、パッケージ管理システムを備えたすべてのディストリビューションで機能するはずです。
Faheemの方法 に対応する他のディストリビューションの同等のツールを収集するためのコミュニティーwikiを以下に示します。自由に編集してください。ただし、検索はアルファベット順にしてください。
pkgfile
リポジトリからextra
を使用し、ヘッダーファイル名をパラメーターとして渡します。
例:
$ pkgfile XInput.h
extra/libxi
extra/nx-headers
(そして Debianベースのものdpkg
を使用)
ヘッダーファイル名のapt-file search
対象として 。
warl0ckによる別の質問で説明されているように 、pfl
パッケージのe-file
プログラムを使用するか、または WebベースのPortageファイルリスト検索 を使用します。