1

我在尝试从 2 组对象编译共享对象时遇到了这个错误。第一个集合包含一个从 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 once'd。

人们对追查问题出在哪里/在哪里有什么建议?

4

2 回答 2

0

如有疑问,假设错误意味着它所说的:实际代码是vector<T>::size在每个目标文件中生成的。这当然看起来很不寻常,因为您希望该函数在每个使用它的文件中内联展开。

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

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

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

于 2010-06-21T19:36:15.477 回答
0

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

以前遇到过这样的问题,但结果总是证明我做的事情很愚蠢。恐怕没什么具体的。

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

于 2010-06-20T01:51:17.173 回答