编译时"collect2: error: ld returned 1 exit status"

"collect2: error: ld returned 1 exit status" when compiling

本文关键字:status exit returned error collect2 编译 ld      更新时间:2023-10-16

我正在开发一个程序:

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

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

完整的给定代码可以用编译

g++ -c user.cpp

链接器指出的问题是,你告诉g++创建一个可执行文件,而不是一个库,但没有指定主要函数:

g++ user.cpp

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

这与您指示的注释行完全无关。然而,真正的问题可能是在Makefile内部;请尝试touch处理代码文件,看看这是否也会导致问题。如果您的Makefile说要重新编译cpp文件,但没有-c标志,则会出现这种行为。例如,尝试从下面的Makefile中删除-c标志:

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