我正处于项目的早期阶段(阅读:刚刚开始),我正在设置我的初始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
答案 0 :(得分:9)
当您将.cpp文件编译为.o文件时,您错过了g ++的-c
参数。就像现在一样,你正在尝试从另一个创建一个可执行文件。
g++ -mwindows -o main.o main.cpp
应为g++ -mwindows -c -o main.o main.cpp
在此期间,还要添加警告标记,至少-Wall
答案 1 :(得分:0)
您是否尝试过调用主int main(...)
代替int WINAPI WinMain(...)
?据我所知,MinGW有自己的WinMain主调用
<强> [编辑] 强>
也就是说,尝试将main.cpp中的int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
更改为int main(int argc, char **argv)