繁体   English   中英

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

[英]Linker error with Duplicated Symbols, SWIG and C++ Vectors

我遇到了尝试从2组对象中编译共享对象的错误。 第一组包含一个.os对象,该对象是由SWIG生成的一个cpp文件编译而成的。 第二组包含组成组成要包装的接口的各个文件中的所有.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。

人们对跟​​踪问题的根源/位置有何建议?

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

以前遇到过这样的问题,但事实证明,这样做总是很愚蠢的。 恐怕没有什么特别的。

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

如有疑问,请假定该错误表示它的含义:实际代码是在每个这些目标文件中为vector<T>::size生成的。 当然这似乎很不寻常,因为您希望函数在使用该文件的每个文件中内联扩展。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM