链接器错误与重复的符号,SWIG和C ++向量

时间:2010-05-21 23:30:21

标签: c++ linker swig stdvector duplicate-symbol

我遇到了这个错误,试图从两组对象中编译共享对象。第一组包含一个由SWIG生成的一个cpp文件编译的.os对象。第二组包含构成要包装的接口的各个文件中的所有.so文件。

$g++ -shared *.os -o Mathlibmodule.so
ld: duplicate symbol std::vector<int, std::allocator<int> >::size() constin Mathlib_wrap.o and Capsule.o

swig c ++包装器(Mathlib_wrap.o的源文件)是机器生成的并且令人讨厌,有很多#defines使它更难以跟踪。看起来重新定义存在于第二组中的所有目标文件中。我已经跟踪了所有这些文件中包含的标题,似乎是#pragma曾经。

人们有什么建议来追踪问题的原因/位置?

2 个答案:

答案 0 :(得分:0)

我将假设您正确#ifndef / #define阻止了C ++库中的所有头文件,之后我会检查您的.i文件以确保您不是实际上以某种方式复制了某些声明。也许先尝试先导入一小部分图书馆。

我之前已经遇到了这样的问题,但它总是被证明是我做过的傻事。没什么具体的我害怕。

发布.i文件,也许,不要。

答案 1 :(得分:0)

如有疑问,请假设错误表示其内容:在每个目标文件中为vector<T>::size生成实际代码。这当然看起来非常不寻常,因为您希望函数在其使用的每个文件中内联展开。

如果不是std::vector我首先要说的是标题中定义的函数没有正确内联标记。编译器将在包含该头的每个源文件中生成代码。您使用的是什么版本的g ++,并且您使用的是自定义标准库/向量实现吗?

要检查的一件事是在(-O2)上进行优化编译,看看是否会导致它在创建实际函数时内联调用。

另一种可能性是,您包含两个不同版本的vector包含,并违反了一个定义规则。那时我不排除你正在看到的链接器错误。