使用矢量模板时mingw链接器错误

时间:2011-12-27 14:15:58

标签: c++ templates vector mingw linker-errors

我在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。

编辑按照答案中给出的建议,我在设置 - &gt;中用g ++。exe替换了用于编译的二进制文件。编译器和调试 - &gt;工具链可执行文件对话框,但我收到相同的错误消息(mingw32-g ++。exe现在被g ++。exe替换)。

编辑(再次)这必须是Code :: Blocks设置的问题,因为从命令行使用g ++进行编译工作正常。

1 个答案:

答案 0 :(得分:2)

使用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

希望有所帮助。