这些g ++"多重定义"错误是什么?

Ken*_*ows 6 c++ winapi mingw makefile g++

我正处于项目的早期阶段(阅读:刚刚开始),我正在设置我的初始makefile.这非常简单.这是文件的完整内容:

all: main.o resource.o
    g++ -o output.exe main.o resource.o

main.o: main.cpp main.h resource.h
    g++ -mwindows -o main.o main.cpp

resource.o: resource.rc
    windres resource.rc resource.o

clean:
    rm *.o 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我认为重要的是要提到我正在使用Windows,所以我在Powershell中使用MinGW g ++ 4.5.2或者使用Cygwin和g ++ 3.4.4(我已经尝试过两者;同样的错误).

如果不打印上面列出的所有文件的内容,就可以说main.h包含对windows.h和resource.h的引用,main.cpp包含对main.h的引用和一些函数,最重要的是int WINAPI WinMain(...)函数和LRESULT CALLBACK WndProc(...)函数,resource.rc包含带有文件菜单和虚拟第二个菜单的简单菜单栏的资源定义语句以及对resource.h的引用和resource.h只包含resource.rc中使用的ID的#define语句.

现在,我可以分别编译resource.rc和main.h,并获得这两个不错的.o文件.但是,当我尝试链接它们并生成output.exe时,我得到以下可怕的错误列表,其中没有一个我真正理解:

main.o:main.cpp:(.text+0x0): multiple definition of `mainCRTStartup'
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../crt2.o:crt1.c:(.text+0x160): first defined here
main.o:main.cpp:(.text+0x0): multiple definition of `WinMainCRTStartup'
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../crt2.o:crt1.c:(.text+0x140): first defined here
collect2: ld returned 1 exit status
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)

以上内容在Powershell中生成.Cygwin提供了一个非常相似的错误列表,仍然以"多重定义"语句为中心.多个定义似乎源于C:/mingw/lib/crt2.o,可能还有另一个名为crt1.c的文件,这似乎更有用,因为很明显C比.o文件更易于人类阅读,但是我无法在C:\ MinGW文件夹中的任何位置找到任何带有该标题的内容.

任何方向都会有所帮助,因为此刻我很丢失.

编辑:main.cpp中唯一的#include语句:

#include "main.h"
Run Code Online (Sandbox Code Playgroud)

main.h的内容:

#ifndef _MAIN_H_
    #define _MAIN_H_

    #include <windows.h>
    #include "resource.h"

#endif
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 9

-c当您将.cpp文件编译为.o文件时,您错过了g ++ 的参数.就像现在一样,您正在尝试从另一个可执行文件创建一个可执行文件.

g++ -mwindows -o main.o main.cpp 应该 g++ -mwindows -c -o main.o main.cpp

在此期间,至少还要添加警告标志 -Wall

  • @KenB在尝试之前是否先做好了清洁工作? (2认同)