Ошибка компоновщика с повторяющимися символами, векторами SWIG и C++

Я столкнулся с этой ошибкой, пытаясь скомпилировать общий объект из двух наборов объектов. Первый набор содержит один объект .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) сгенерирована машиной, и на нее неприятно смотреть, с большим количеством #define, которые усложняют отслеживание. Похоже, что переопределение присутствует во всех объектных файлах второго набора. Я проследил заголовки, включенные во все эти файлы, и, кажется, когда-то был #pragma.

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


person Ben Jones    schedule 21.05.2010    source источник
comment
Учитывая количество информации, которую вы можете предоставить, я должен порекомендовать вам прекратить использовать swig.   -  person Hans Passant    schedule 22.05.2010
comment
Это кодовая база, которую я только что унаследовал, которую я переношу из кроссплатформенных библиотек из MSVC в * nix + SCons. Я сам не очень хорошо знаком с кодом, поэтому я искал более общий совет, подобный такому, и такая конструкция часто вызывает эти ошибки. Что касается SWIG, я очень хочу иметь возможность писать сценарии на Python, поэтому отказ от SWIG не является привлекательным вариантом.   -  person Ben Jones    schedule 22.05.2010


Ответы (2)


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

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

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

person Petriborg    schedule 20.06.2010

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

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

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

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

person Mark B    schedule 21.06.2010