为什么我们需要在可执行文件的编译期间存在共享库?我的推理是,由于共享库未包含在我的可执行文件中并在运行时加载,因此在编译时不应需要它。或者我错过了什么?
#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;
}
我有libfoo.so
在我当前的目录中,但我将其名称更改为libfar.so
发现编译时需要共享库,否则无法编译。
gcc -o main main.c -L. -lfoo
gives main.c:(.text+0x28): undefiend reference to 'addNumber'
我认为只有共享库的名称就足够了。共享库本身不是必需的,因为它可以在 LD_LIBRARY_PATH 中找到并在运行时动态加载。除了共享库的名称之外还需要其他什么吗?
不需要任何东西compile时间,因为C有一个单独编译的概念翻译单位。但是,一旦所有不同的来源都被编译完毕,就该将所有内容链接在一起了。标准中没有共享库的概念,但它现在很常见,所以这里是如何common链接器收益:
- 它在所有已编译的模块中查找具有已定义或仅声明的外部链接的标识符
- 它在库(静态和动态)中查找已使用且未定义的标识符。然后它链接静态库中的模块,并存储动态库中的引用。但至少在类 Unix 上,它需要访问共享库以获取潜在所需的(声明的和未定义的)标识符,以确保它们已经定义或可以在其他链接库(无论是静态还是动态)中找到
这会生成可执行文件。然后在加载时,动态加载器知道所需的所有动态模块,并将它们与实际的可执行文件一起加载到内存中(如果它们尚不存在),并构建(虚拟)内存映射
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)