链接时多重定义怎么办?

2020-08-02

链接时多重定义怎么办?一般解决方案是:只保留一个定义的地方就好了,这对强迫症,很友好!但往往有时又嫌麻烦,或者杂七杂八的的原因导致了,两个定义都保留,但只让链接时,只链接第一个遇到的定义函数!

其实吧,如果这多重定义的函数是存在于不同的库,一般默认都只会找第一个遇到的库里面的函数就好了。

但是,因为,链接的最小单元一般是文件,*.o。如果a.o和b.o同时存在test1(),但是a.o有test2(),b.o有test3(),结果这两个接口函数都会被系统使用,那么a.o和b.o就会被同时链接进去。这就是为何会报多重定义的错误。

为了让这种情况下,链接器还是不报错,还是只会找第一个遇到的库里面的函数。可以使用以下参数:

-Wl,-z,multidefs或者Wl,'-z muldefs'

让ld在遇到重复定义时候,只处理第一个定义。