Ошибка компоновщика mingw при использовании векторных шаблонов - PullRequest
0 голосов
/ 27 декабря 2011

Я использую MinGw на Windows 7. Следующая простая программа компилируется нормально, но компоновщик жалуется, и я не понимаю, в чем дело:

#include <iostream>   
#include <vector>

using namespace std;

int main()
{
   std::vector<int> iv;
   iv.push_back(7);
   cout << iv.back() << endl;
   return 0;
}

сообщения компилятора / компоновщика выглядят следующим образом:

mingw32-g++.exe -Wall -fexceptions  -std=c++0x -Wall -g  -std=c++0x -Wall -g -frepo   -IC:\cppbuchincludes\include -IG:\Boost -IG:\Users\thomas\cpp\STLUsage\\include  -c G:\Users\thomas\cpp\STLUsage\main.cpp -o obj\Debug\main.o
mingw32-g++.exe  -o bin\Debug\STLUsage.exe obj\Debug\main.o    G:\Boost\stage\lib\libboost_filesystem-mgw45-mt-d-1_45.dll.a G:\Boost\stage\lib\libboost_regex-mgw45-mt-d-1_45.dll.a G:\Boost\stage\lib\libboost_system-mgw45-mt-d-1_45.dll.a G:\Boost\stage\lib\libboost_thread-mgw45-mt-1_45.dll.a G:\Boost\stage\lib\libboost_unit_test_framework-mgw45-mt-d-1_45.dll.a
collect: recompiling G:\Users\thomas\cpp\STLUsage\main.cpp
collect: relinking
collect2: '_ZNSt12_Vector_baseIiSaIiEEC1Ev' was assigned to 'obj\Debug\main.rpo', but was not defined during recompilation, or vice versa
obj\Debug\main.o: In function `vector':
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_vector.h:208: undefined reference to `std::_Vector_base<int, std::allocator<int> >::_Vector_base()'
(...and so on...)

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

У меня есть этот двоичный файл MinGw из книги, и я следовал инструкциям в этой книге относительно настроек компилятора.В частности, ссылки на Boost libs взяты оттуда.

Это должно быть просто, я просто хочу использовать STL тривиально.

Редактировать Следуя совету, данному в ответе, я заменил двоичный файл наиспользоваться для компиляции с помощью g ++. exe в диалоговом окне «Настройки» -> «Компилятор и отладка -> исполняемые файлы инструментария», но я получаю те же сообщения об ошибках (при замене mingw32-g ++. exe на g ++. exe).1016 * Редактировать (еще раз) это должно быть проблемой с настройками Code :: Blocks, поскольку компиляция с использованием g ++ из командной строки работает просто отлично.

1 Ответ

2 голосов
/ 27 декабря 2011

Используйте g++ для компиляции и компоновки программы. mingw32-g++.exe не делает этого.

FAQ говорит,

В чем разница между gcc и mingw32-gcc?

Двоичные файлы mingw32-gcc, mingw32-g ++ и т. Д. Существуют как средство для перекрестного развития. Они созданы в типичной сборке gcc. Таким образом, они распространяются так, как их называли сопровождающие GCC. Файл gcc.exe указывает, что двоичный файл создает двоичные файлы для цели, равной сборке, в то время как двоичный файл mingw32-gcc создает двоичные файлы, которые должны выполняться на цели mingw32.

Итак, я думаю, проблема в том, что mingw32-g++.exe, который вы не должны использовать для нормальной сборки.

Попробуйте это:

g++ program.cpp              //simple build

g++ program.cpp  -Wall       //build with all warnings enabled

g++ program.cpp  -Wall -O2   //enable warnings and optimization level 2

g++ program.cpp -std=c++0x   //use C++11 features

Надеюсь, это поможет.

...