私はLinuxの仕組みとモジュールの構築方法を理解しようとしています。
これまで、Linuxヘッダーがに格納されてい/usr/include
て、これらのインターフェースのコンパイル済み実装が存在することを確認しました/usr/lib/x86_64-linux-gnu
。いくつかの質問があります。
LinuxまたはCプログラムは、ヘッダーファイルと.soファイルを見つける場所をどのように知ることができますか?これを定義するファイルはありますか?ハングアウト用に別の既定のソースまたはタイトルフォルダを追加したい場合は、これらの参照を編集できますか?
紛争を避ける方法は?たとえば、として定義されたヘッダファイルが
libprocps-dev
あります。このファイルの実装はにあります。誰かが関数定義は同じですが、別の実装(またはコード)を使用して別の.soファイルをコンパイルして追加するとどうなりますか?リンカーは、そのヘッダー定義にリンクする必要がある正しい.soファイルが何であるかをどうやって知ることができますか?/usr/include/proc/numa.h
void numa_uninit (void);
/usr/lib/x86_64-linux-gnu/libprocps.so
/usr/lib/x86_64-linux-gnu
ありがとうございます。
答え1
私はLinuxの仕組みとモジュールの構築方法を理解しようとしています。
カーネルモジュールのビルドには、「標準」Cコンパイラディレクトリは含まれていません。を参照してください/lib/modules/$(uname -r)/build
。
氏プログラムヘッダファイルとライブラリがどこにあるのかわかりません。 Cプリプロセッサとコンパイラはこれを行います。以下を使用して標準インクルードディレクトリを表示できます。
gcc -xc -E -v - < /dev/null
(C ++の場合
-xc
に置き換えます-xc++
)、ライブラリを使用してディレクトリを検索します。gcc -print-search-dirs
コンパイラは競合を避けません。検索パスに競合するヘッダーがないことを確認するのは、コンパイラを実行している人に依存します。ライブラリは自動的にリンクされないため、リンカコマンドラインにライブラリを追加する必要があります(
-lprocps
例では、他のライブラリは無視されます)。どちらの場合も、競合が発生すると、コンパイルおよび/またはリンクはエラーで停止します。