2011-01-23 13 views
6

私はプロジェクトの初期段階(読んでいる:昨日始まったばかりです)におり、私は最初のmakefileを設定しています。非常に単純です。ここでは、ファイルの完全な内容です:4.5.2 ++私はそれは私がWindows上で働いていることを言及することが重要だと思います。この時点でこれらのg ++​​の "多重定義"エラーは何ですか?

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 

を、私はMinGWのgはどちらかPowerShellでこのすべてをやっていますか、 else Cygwinとg ++ 3.4.4(私は両方とも同じエラーを試しました)。

上記のすべてのファイルの内容を表示しないで、main.hにはwindows.hとresource.hへの参照が含まれていればよく、main.cppにはmain.hへの参照といくつかの関数最も重要なのは、int WINAPI WinMain(...)関数とLRESULT CALLBACK WndProc(...)関数で、resource.rcには、ファイルメニューとダミーの第2メニューを持つ単純なメニューバーとリファレンスresource.hに、そしてresource.hは単にresource.rcで使用されるIDの#defineステートメントを含んでいます。

ここで、resource.rcとmain.hの両方をお互いにコンパイルして、これらの2つのnice .oファイルを取得できます。

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で生成されます。私はそれらをリンクしてoutput.exe生成しようとすると、しかし、私は本当に理解していずれもエラー、次の怖いのリストを取得します。 Cygwinは "多重定義"ステートメントを中心に、非常に似たエラーリストを提供します。複数の定義はC:/mingw/lib/crt2.oに由来するように見えますが、crt1.cという別のファイルもあります。これは明らかにCが.oファイルよりもはるかに読みやすくなりますが私はC:\ MinGWフォルダ内のどこでもそのタイトルで何かを見つけることができません。

私はかなり迷っていますので、どんな方向にも役立ちます。

EDIT:main.cppに中 唯一の#includeステートメント:main.hの

#include "main.h" 

内容:

#ifndef _MAIN_H_ 
    #define _MAIN_H_ 

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

#endif 
+0

少なくとも-Wallは、おそらくそれはヘッダが含まれているmain.cppにファイルの最初の部分を見るために役立つだろう、同様の警告フラグを追加する必要があります。明示的にインクルードされているヘッダーの1つが別のヘッダーファイルに暗黙的にインクルードされる必要があることを理解することで解決された、これと同様の問題があることを思い出しました。 – hardmath

+0

'_MAIN_H_'で先頭のアンダースコアを使用しないでください。先頭のアンダースコアの名前はライブラリ用に予約されています。 – KitsuneYMG

答えて

8

あなたがに-c引数が欠落しているのでint main(int argc, char **argv)int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)を変更してみてくださいg ++ .cppファイルを.oファイルにコンパイルするとき今のように、別のものから1つの実行可能ファイルを作成しようとしています。

g++ -mwindows -o main.o main.cpp

g++ -mwindows -c -o main.o main.cppはそれでいる間、

+0

いいですが、それは助けになりませんでした。 –

+1

@KenB試してみる前に 'きれいにしましたか? – ssmir

+0

ああ私の言葉。私は馬鹿のように感じる。それがそれでした。お互いに感謝します。 –

0

あなたのメインint main(...)代わりのint WINAPI WinMain(...)を呼び出してみましたか?私が覚えている限りではMinGWのは、独自のWinMain関数が呼び出したメイン

[編集]ある

、あなたのmain.cppに

+0

WinMain引数をどのように参照しますか? WinMainが以下のように構築されていることを覚えておいてください: –

+0

@KenBこの引数はWinMainで使用されていますか?いいえ、 – ssmir

+0

はい。これは単純なWin32 APIプログラムです。 –

関連する問題