我试图用g ++将我的可执行程序与2个静态库链接起来。 2个静态库具有相同的函数名称。 我期待链接器的“多重定义”链接错误,但我没有收到。 谁能帮忙解释为什么这样?
staticLibA.h
#ifndef _STATIC_LIBA_HEADER #define _STATIC_LIBA_HEADER int hello(void); #endif
staticLibA.cpp
#include "staticLibA.h" int hello(void) { printf("nI'm in staticLibAn"); return 0; }
输出:
g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp ar -cvq ../libstaticLibA.a staticLibA.oa - staticLibA.o
staticLibB.h
#ifndef _STATIC_LIBB_HEADER #define _STATIC_LIBB_HEADER int hello(void); #endif
staticLibB.cpp
#include "staticLibB.h" int hello(void) { printf("nI'm in staticLibBn"); return 0; }
输出:
g++ -c -Wall -fPIC -m32 -o staticLibB.o staticLibB.cpp ar -cvq ../libstaticLibB.a staticLibB.oa - staticLibB.o
main.cpp中
extern int hello(void); int main(void) { hello(); return 0; }
输出:
与机制分开的政策:这是什么意思?
什么是Windows代码页?
ros :: init(…)抛出一个错误 – Windows roscpp
上游/下游术语向后使用? (例如Nginx)
确定types的定义
g++ -c -o main.o main.cpp g++ -o multipleLibsTest main.o -L. -lstaticLibA -lstaticLibB -lstaticLibC -ldl -lpthread -lrt
如何从TFS构build定义输出Windows服务项目
链接器不查看staticLibB ,因为在staticLibA链接的时候,没有未实现的依赖关系。
这是一个容易的。 如果引用的符号尚未定义,则只能从库中取出对象。 只有一个hellos被拉(从A)。 如果与.o文件链接,则会出现错误。
当链接器尝试将main.o链接到multipleLibsTest并且发现hello()未解析时,它将按照命令行中给出的顺序开始搜索库。 它会在staticLibA找到hello()的定义,并终止搜索。
它根本不会查看staticLibB或staticLibC 。
如果staticLibB.o包含不在staticLibB.o中的另一个符号,并且被拖入最终的可执行文件中,则会得到hello错误的多重定义,因为个别的.o文件被从库中提取出来,其中两个文件将会有hello() 。 在链接命令行上反转staticLibA和staticLibB的顺序将使该错误消失。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。