最近我将自己的库更改(用于打包)为STATIC。现在我收到错误消息,表明库中定义的变量是多重定义的。没关系,图书馆互相使用。但是为什么在我改为STATIC之前链接器没有注意到这一点? 在我的一个文件中,我将变量声明为'extern',链接器也将其标记为'multiply defined'。可以吗?
答案 0 :(得分:1)
基本上编译器有4个阶段:
预处理:宏观和符号版
编译:生成由处理器执行的汇编代码
组装:生成机器可以理解的二进制代码(0/1二进制代码)
链接:前面三个操作是针对每个文件单独完成的,但是我们需要编辑每个变量的地址映射,指针,这里的整个项目的函数当我们有一些问题的时候我们有一些变量的多个定义因为链接将检查所有文件并为整个项目生成输出。
如果一个库被声明为static,那么这个库中声明和定义的函数在运行时才能使用,但是在编译时不允许在其他文件中使用这个库,所以如果是这样的话我们在链接阶段会出现错误,因为编译器会通过另一个不允许的文件找出在这个静态库中使用该函数。
如果你想要它是静态的,那么使用运行时概念来使用这个库(例如在C中你可以使用指向函数。
答案 1 :(得分:0)
但是为什么在我改为STATIC之前链接器没有注意到这一点?
运行时链接器允许重复的符号定义(只有一个将在运行时使用,这是symbol interposition)。