我正处于一个项目的早期阶段(请阅读:昨天刚刚开始),我正在设置我的初始 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 和 resources.h 的引用,main.cpp 包含对 main.h 的引用和一些函数,最重要的是int WINAPI WinMain(...) 函数和 LRESULT CALLBACK WndProc(...) 函数,resource.rc 包含带有文件菜单和虚拟第二个菜单的简单菜单栏的资源定义语句以及对 resources.h 的引用,而resource.h仅包含resource.rc中使用的ID的#define语句。
现在,我可以分别编译 resources.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