当前位置: 技术问答>linux和unix
linux下ld不自动检查函数重名,求救!
来源: 互联网 发布时间:2016-12-10
本文导语: 有两个c文件,t.c和t2.c,分别定义了一个函数ttt(); 按说编译之后再链接时,应该报错: multiple definition of `ttt'。但实际情况却是: 1) 如果我编译出两个obj(t.obj t2.obj),然后ld 这两个obj,的确会报错: [root@loca...
有两个c文件,t.c和t2.c,分别定义了一个函数ttt();
按说编译之后再链接时,应该报错: multiple definition of `ttt'。但实际情况却是:
1) 如果我编译出两个obj(t.obj t2.obj),然后ld 这两个obj,的确会报错:
[root@localhost temp]# gcc -o t2.obj -c t2.c;gcc -o t.obj -c t.c
[root@localhost temp]# ld t.obj t2.obj
t2.obj: In function `ttt':
t2.c:(.text+0x0): multiple definition of `ttt'
t.obj:t.c:(.text+0xf): first defined here
但是,如果我把两个.obj ar成一个.a包,再针对.a包进行ld,则不会报错:
[root@localhost temp]# gcc -o t2.obj -c t2.c;gcc -o t.obj -c t.c;ar crus t.a t.obj t2.obj
[root@localhost temp]# gcc -o t2.obj -c t2.c;gcc -o t.obj -c t.c;ar crus t.a t.obj t2.obj;ld --start-group t.a --end-group -e main
[root@localhost temp]#
现在我们代码工程很大,而且是分模块维护,互相之间通过.a进行版本共享,避免不了这个问题。
求支招,不胜感激!
按说编译之后再链接时,应该报错: multiple definition of `ttt'。但实际情况却是:
1) 如果我编译出两个obj(t.obj t2.obj),然后ld 这两个obj,的确会报错:
[root@localhost temp]# gcc -o t2.obj -c t2.c;gcc -o t.obj -c t.c
[root@localhost temp]# ld t.obj t2.obj
t2.obj: In function `ttt':
t2.c:(.text+0x0): multiple definition of `ttt'
t.obj:t.c:(.text+0xf): first defined here
但是,如果我把两个.obj ar成一个.a包,再针对.a包进行ld,则不会报错:
[root@localhost temp]# gcc -o t2.obj -c t2.c;gcc -o t.obj -c t.c;ar crus t.a t.obj t2.obj
[root@localhost temp]# gcc -o t2.obj -c t2.c;gcc -o t.obj -c t.c;ar crus t.a t.obj t2.obj;ld --start-group t.a --end-group -e main
[root@localhost temp]#
现在我们代码工程很大,而且是分模块维护,互相之间通过.a进行版本共享,避免不了这个问题。
求支招,不胜感激!
|
打包成库文件后,ld可能就不检查重复了,从里面找到第一个函数拉倒了
考虑借助于nm 命令吧,查找重复定义的函数
nm -s t.a|sort|uniq -d
考虑借助于nm 命令吧,查找重复定义的函数
nm -s t.a|sort|uniq -d
|
用楼上的nm命令分析下,如果有重复模块就报警
|
关注一下。O(∩_∩)O~