【发布时间】:2011-06-14 03:36:29
【问题描述】:
我正处于一个项目的早期阶段(阅读:昨天刚开始),我正在设置我的初始 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
【问题讨论】:
-
也许查看包含头文件的 main.cpp 文件的第一部分会有所帮助。我记得有一个与此类似的问题,通过理解我明确包含的一个头文件需要被另一个头文件隐式包含,这样
#define才能正确设置。 -
不要在
_MAIN_H_中使用前导下划线。带有前导下划线的名称是为库保留的。
标签: c++ winapi makefile g++ mingw