繁体   English   中英

动态链接库中如何处理“外部”变量?

[英]How 'extern' variables are handled in dynamically linked libraries?

最近,我将自己的库(用于打包)更改为STATIC。 现在,我收到错误消息,指出在库中定义的变量被乘以定义。 可以,这些库可以互相使用。 但是,为什么在我更改为STATIC之前,链接器没有注意到这一点? 在我的一个文件中,我将声明为“ extern”的变量设置为变量,链接器还将其标记为“乘以定义”。 可以吗

基本上,编译器有四个阶段:

预处理:宏和符号版

编译:生成要由处理器执行的汇编代码

组装:生成机器可以理解的二进制代码(0/1二进制代码)

链接:前面的三个操作是针对每个文件分别完成的,但是我们需要在这里对整个项目的每个变量,指针,函数的地址映射进行编辑,如果我们在对变量有多个定义的时候会遇到一些问题,因为链接会检查所有文件并为整个项目生成输出。

如果一个库被声明为静态的,则该库中已声明和定义的函数要等到运行时才能使用,但在编译时不允许在其他文件中使用该库,因此,在这种情况下,我们会得到错误提示在链接阶段,因为编译器会找出另一个文件不允许在此静态库中使用该函数的情况。

如果您希望它是静态的,则可以使用运行时概念来使用此库(例如,在C语言中,可以使用指向函数的指针)。

但是,为什么在我更改为STATIC之前,链接器没有注意到这一点?

运行时链接程序允许重复的符号定义(在运行时仅使用一个,这是符号插入 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM