2011-12-27 5 views
0

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

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

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

Редактировать следуя советам данного в ответ, я заменил двоичный, который будет использоваться для компиляции на г ++ ехе в Настройки -.> Compiler и отладка -> Диалог Toolchain исполняемых файлов, но я получаю ту же ошибку сообщения (с mingw32-g ++. exe теперь заменяется на g ++. exe).

Редактировать (еще раз) это должно быть проблемой с кодом Code :: Blocks, так как компиляция с использованием g ++ из командной строки работает нормально.

ответ

2

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

FAQ говорит,

Какая разница между НКУ и 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 

Надежда, что помогает.

+0

Спасибо, что ответили. mingw32-g ++ был выбран по умолчанию установкой Code :: Blocks, и опция была отображена как «использовать GCC», поэтому, вероятно, меня обманули в использовании неправильного двоичного кода. Я заменил его в настройках g ++ exe, очистил дерево каталогов и попробовал еще раз, но получаю точно такую ​​же ошибку (с mingw32-g ++. Exe теперь заменяется на g ++. Exe, конечно). – Thomas

+0

@Thomas: Ну, это означает, что модель компиляции пропускает объектные файлы, в которых определяется вектор. Посмотрите еще раз свои настройки. У меня нет опыта работы с Code :: Blocks, поэтому я не могу точно определить проблемы с настройкой. – Nawaz

+1

Хорошо, спасибо большое. Я попытался скомпилировать из командной строки сейчас, и там он компилируется отлично. Так что это, скорее всего, вещь Code :: Blocks. – Thomas

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