Gab*_*是好人 12 c gcc compilation shared-libraries dynamic-linking
为什么在可执行文件的编译期间我们需要共享库的存在?我的理由是,由于共享库未包含在我的可执行文件中并在运行时加载,因此在编译期间不应该需要它.还是我错过了什么?
#include<stdio.h>
int addNumbers(int, int); //prototype should be enough, no?
int main(int argc, char* argv[]){
int sum = addNumbers(1,2);
printf("sum is %d\n", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有libfoo.so
我当前的目录,但我改名libfar.so
,发现在编译时需要共享库,或者它不能编译.
gcc -o main main.c -L. -lfoo
给 main.c:(.text+0x28): undefiend reference to 'addNumber'
我认为只有共享库的名称才足够.不需要共享库本身,因为它在LD_LIBRARY_PATH中找到并在运行时动态加载.除了共享库的名称之外还需要其他东西吗?
编译时不需要任何东西,因为C有一个单独编译翻译单元的概念.但是,一旦编译完所有不同的来源,就可以将所有内容链接在一起了.共享库的概念在标准中不存在,但它现在是常见的,所以这里是一个常见的链接器如何进行:
这会生成可执行文件.然后在加载时,动态加载器知道所需的所有动态模块,并将它们与实际可执行文件一起加载到内存中(如果它们尚未存在)并构建(虚拟)内存映射