微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我没有从g ++得到“多重定义”的错误?

我试图用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] 举报,一经查实,本站将立刻删除。

相关推荐