我正在进行一个项目的早期阶段(即:昨天刚开始),正在设置我的初始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
在这一点上,我认为重要的是提到我正在使用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
以上内容是由Powershell生成的。Cygwin也提供了一个非常相似的错误列表,仍然集中在“多重定义”语句周围。这些多重定义似乎起源于C:/mingw/lib/crt2.o,可能还有另一个名为crt1.c的文件,因为显然C比.o文件更易读,但我无法在C:\MinGW文件夹中找到任何具有该标题的内容。
任何方向都将有所帮助,因为目前我感到相当迷失。
编辑: main.cpp中唯一的#include语句:
#include "main.h"
main.h的内容:
#ifndef _MAIN_H_
#define _MAIN_H_
#include <windows.h>
#include "resource.h"
#endif
#define
才能正确设置。 - hardmath