web-dev-qa-db-ja.com

特定のCライブラリ関数を使用するために必要なリンカーフラグを見つけるにはどうすればよいですか?

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の検索を使用して、同じヘッダーをインポートする他のプログラムを見つけ、そのメイクファイルを開き、リンカーフラグを見つけます。それらを私のコンパイルコマンドにコピーし、コンパイルできる最小限のセットが見つかるまでフラグを削除し続けます。

これは非効率的で退屈であり、より良い方法があるに違いないと私に感じさせます。

5
Anko

問題は、ソースファイルの検査から使用するリンカーフラグを決定する方法です。以下の例は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リンカーフラグ。

同様の方法は、パッケージ管理システムを備えたすべてのディストリビューションで機能するはずです。

5
Faheem Mitha

Faheemの方法 に対応する他のディストリビューションの同等のツールを収集するためのコミュニティーwikiを以下に示します。自由に編集してください。ただし、検索はアルファベット順にしてください。

アーチ

pkgfileリポジトリからextraを使用し、ヘッダーファイル名をパラメーターとして渡します。

例:

$ pkgfile XInput.h
extra/libxi
extra/nx-headers

Debian

(そして Debianベースのものdpkgを使用)

ヘッダーファイル名のapt-file search対象として

Gentoo

warl0ckによる別の質問で説明されているようにpflパッケージのe-fileプログラムを使用するか、または WebベースのPortageファイルリスト検索 を使用します。

2
Anko