我试图了解 Linux 的工作原理以及如何构建模块。
到目前为止,我看到 Linux 头文件存储/usr/include
在/usr/lib/x86_64-linux-gnu
. 我有几个问题:
Linux 或任何 C 程序如何知道在哪里查找头文件和 .so 文件?有没有定义这个的文件?如果我想添加另一个默认源或标题文件夹(只是为了骑马),是否可以修改这些引用?
如何避免冲突?例如,在libprocps-dev
有一个/usr/include/proc/numa.h
定义为void numa_uninit (void);
. 该文件的实现在/usr/lib/x86_64-linux-gnu/libprocps.so
. 如果有人还编译了另一个具有相同函数定义但具有另一个实现(或代码)的 .so 文件并将其添加到/usr/lib/x86_64-linux-gnu
. 链接器如何知道哪个是正确的 .so 文件必须链接到该标头定义?
谢谢。
我试图了解 Linux 的工作原理以及如何构建模块。
构建内核模块不涉及“标准”C 编译器目录;相反,请参阅/lib/modules/$(uname -r)/build
。
C程序不知道去哪里寻找头文件和库;C 预处理器和编译器做。您可以使用以下命令查看标准包含目录
gcc -xc -E -v - < /dev/null
(替换-xc
与-xc++
用于C ++),以及使用该库搜索目录
gcc -print-search-dirs
编译器不会避免冲突;这取决于运行编译器的任何人或任何人,以确保搜索路径不包含冲突的标头。库不会自动链接,您必须将库添加到链接器命令行(-lprocps
在您的示例中);任何其他库都将被忽略。在这两种情况下,当发生冲突时,编译和/或链接会因错误而停止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句