Множественное определение множества функций std :: при связывании - PullRequest
0 голосов
/ 05 февраля 2010

Я пытаюсь интегрировать некоторый внешний код в мое приложение. Мой код был чисто C, но новый код - C ++, поэтому я просто переименовал свои C-файлы в .cc и скомпилировал все это с помощью g ++.

Он прекрасно компилируется, но я получаю краткие ошибки ссылок:

CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new(unsigned long, void*)':
svrtH_generator.cc:(.text+0x0): multiple definition of `operator new(unsigned long, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x0): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new[](unsigned long, void*)':
svrtH_generator.cc:(.text+0x10): multiple definition of `operator new[](unsigned long, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x10): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator delete(void*, void*)':
svrtH_generator.cc:(.text+0x20): multiple definition of `operator delete(void*, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x20): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator delete[](void*, void*)':
svrtH_generator.cc:(.text+0x30): multiple definition of `operator delete[](void*, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x30): first defined here
[you got the idea...]
svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0xe80): first defined here
collect2: ld returned 1 exit status
make[3]: *** [dev/svrt/libsvrt.so] Error 1
make[2]: *** [dev/svrt/CMakeFiles/svrt.dir/all] Error 2
make[1]: *** [dev/svrt/CMakeFiles/svrt.dir/rule] Error 2
make: *** [svrt] Error 2

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

Обратите внимание, что предупреждение исходит из ссылки на мой собственный код, а не (пока) из нового кода C ++.

Кто-нибудь?

РЕДАКТИРОВАТЬ: после поиска во внешнем коде, который я пытаюсь интегрировать, я нашел некоторые из них:

#include <iostream> 
#include <cmath> 
#include <fstream> 
#include <cfloat> 
#include <stdlib.h> 
#include <string.h> 

Кроме того, iostream также включен в другие заголовки, и все они имеют охрану.

ОБНОВЛЕНИЕ: мне удалось немного почистить внешний код и удалить ненужные зависимости. У меня все еще есть некоторые ошибки компоновщика, но намного меньше:

CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `std::abs(long)':
svrtH_generator.cc:(.text+0x0): multiple definition of `std::abs(long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x0): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `__gnu_cxx::abs(long long)':
svrtH_generator.cc:(.text+0x20): multiple definition of `__gnu_cxx::abs(long long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x20): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `__gnu_cxx::div(long long, long long)':
svrtH_generator.cc:(.text+0x40): multiple definition of `__gnu_cxx::div(long long, long long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x40): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `std::div(long, long)':
svrtH_generator.cc:(.text+0x350): multiple definition of `std::div(long, long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x150): first defined here

Код включает в себя cmath и cstdlib и ссылается на abs и другие функции, использующие пространство имен по умолчанию. Может ли это быть проблемой?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

Кажется, у вас есть некоторые функции с именами new и delete, и это зарезервированные ключевые слова в C ++ для выделения памяти. Попробуйте переименовать их во что-то другое (например, svrt_new, svrt_delete).

Также эта строка на самом деле наиболее информативна:

svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)'

Вы должны как-то включить две версии заголовков iostream ...

0 голосов
/ 09 февраля 2010

Наконец-то я смог собрать вещи. Я обнаружил некоторые подсказки о том, что я должен избавиться от включений в стиле C (#include <stdlib.h>) и заменить их включениями в стиле C++ (#include <cstdlib>). Это сделало вещи хуже!

Перевод включений обратно в стиль .h (и исправление несоответствий в коде exernal) порадовал компоновщика.

Это, и удаление всего неиспользуемого кода и включений из внешнего кода, решило мою проблему. Спасибо за вашу помощь, ребята!

0 голосов
/ 05 февраля 2010

Это похоже на ситуацию, когда вы не сделали , включая охранников . Но все эти функции подозрительно похожи на собственные функции C ++. Вы уверены, что не используете некоторые заголовки C ++?

...