编译器如何找出我的代码中将使用哪个动态链接库,如果我只包含头文件,哪里不描述它?
#include <stdio.h>
void main()
{
printf("Hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
我只包括
stdio.h
Run Code Online (Sandbox Code Playgroud)
我的代码被使用了
printf function
Run Code Online (Sandbox Code Playgroud)
如何知道,在头文件原型,宏和常量中描述,但没有关于在哪个文件"printf"实现.它是如何工作的?
编译可运行的可执行文件时,不仅要指定源代码,还要指定查找未定义引用的库列表.使用C标准库,这是隐式发生的(除非你告诉GCC -nostdinc),所以你可能没有意识到这一点.
这些库仅由链接器使用,而不是编译器使用.链接器定位库中的所有未定义引用.如果库是静态库,则链接器只会将实际的机器代码添加到最终的可执行文件中.另一方面,如果库是共享库,则链接器仅在可执行文件的头中记录库的名称(和版本?).然后,加载器的工作是在加载时找到适当的库并动态解决缺少的依赖项.
在Linux上,您可以使用ldd列出动态链接可执行文件的加载时依赖性,例如try ldd /bin/ls.