2010-05-21 6 views
1

Я столкнулся с этой ошибкой, пытаясь скомпилировать общий объект из двух наборов объектов. Первый набор содержит один объект .os, скомпилированный из одного файла cpp, сгенерированного SWIG. Второй набор содержит все .so-файлы из отдельных файлов, которые составляют интерфейс для упаковки.Ошибка компоновщика с дублированными символами, векторами SWIG и C++

$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.

Какой совет у людей есть для отслеживания того, что/где проблема?

+1

Учитывая объем информации, которую вы могли бы предоставить, я должен был бы рекомендовать вам прекратить использование swig. –

+0

Его кодовая база, которую я только что унаследовал, что я «портирую» из кросс-платформенных библиотек от MSVC до * nix + SCons. Я сам не очень хорошо разбираюсь в коде, поэтому я искал более общие рекомендации, такие как «такая-то и такая конструкция часто вызывает эти ошибки». Что касается SWIG, я очень хочу иметь возможность писать сценарии на python, поэтому утилизация SWIG не является привлекательным вариантом. –

ответ

0

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

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

Опубликовать .i файл, возможно, donno.

0

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

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

Прежде всего необходимо скомпилировать с оптимизацией (-O2) и посмотреть, не заставляет ли он встроить вызовы в создание фактической функции.

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

 Смежные вопросы

  • Нет связанных вопросов^_^