编译时“collect2:error:ld返回1退出状态”

时间:2014-04-29 04:15:59

标签: c++

我正在制作一个计划:

#include <iostream>
#include <vector>
#include <utility> //std::pair, std::make_pair

using namespace std;

class User { 
    private: 
        size_t userIndex;
        vector< pair<int,int> > ratings;

    public:
        void addRating(int movieIndex, int rating) {
            ratings.push_back( make_pair(movieIndex, rating) );
        }
};

但是,当我使用g ++编译它时,我收到以下错误:

/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-1.7.28-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-1.7.28-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status

有趣的是,当我注释掉以下行时,这个错误消失了:

    //vector< pair<int,int> > ratings;

为什么在取消注释此行时会发生这种情况?

1 个答案:

答案 0 :(得分:0)

完整的给定代码可以使用以下命令进行编译:

g++ -c user.cpp

链接器指示的问题是,您要告诉g ++创建可执行文件,而不是库文件,但是未指定主要功能:

g++ user.cpp

给出您提到的WinMain丢失(在Windows下)的错误。

这与您要评论的行完全无关。但是,可能真正的问题出在Makefile内部。尝试touch替换代码文件,看看是否也导致了问题。如果您的Makefile说要重新编译cpp文件,但没有正确使用-c标志,您将得到这种行为。例如,尝试从下面的Makefile中删除-c标志:

%.o: %.cpp %.h
    g++ -c %.cpp