Ошибка компоновщика с дублированными символами, векторами SWIG и C ++ - PullRequest
1 голос
/ 22 мая 2010

Я столкнулся с этой ошибкой, пытаясь скомпилировать общий объект из 2 наборов объектов.Первый набор содержит один объект .os, скомпилированный из одного файла cpp, созданного SWIG.Второй набор содержит все файлы .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 голосов
/ 21 июня 2010

Если вы сомневаетесь, предположите, что ошибка означает, что она говорит: фактический код был сгенерирован для vector<T>::size в каждом из этих объектных файлов. Это, конечно, кажется очень необычным, потому что вы ожидаете, что функция будет расширена встроенным в каждом файле, в котором она использовалась.

Если бы это не было std::vector, первое, что я бы сказал, это то, что функция, определенная в заголовке, не была помечена как встроенная правильно. Компилятор генерирует код в каждом исходном файле, который включает этот заголовок. Какую версию g ++ вы используете и используете ли вы собственную стандартную библиотечно-векторную реализацию?

Одна вещь, которую нужно проверить - это скомпилировать с оптимизацией (-O2) и посмотреть, не вызывает ли это встроенные вызовы при создании фактической функции.

Другая возможность состоит в том, что вы включаете две разные версии vector include и нарушаете одно правило определения. В этот момент я бы не исключил ошибку компоновщика, такую ​​как вы видите.

0 голосов
/ 20 июня 2010

Я предполагаю, что вы # ifndef / # определите, что правильно заблокировали все файлы заголовков в вашей библиотеке C ++, после чего я проверю ваш файл .i, чтобы убедиться, что вы на самом деле не дублируете какая-то декларация там как-то. Может быть, сначала попробуйте импортировать небольшой кусочек библиотеки или что-то в этом роде.

У меня были проблемы, подобные этим, но это всегда было чем-то глупым, что я сделал. Боюсь, ничего конкретного.

Опубликуйте файл .i, может быть, донно.

...