2017-06-11 5 views
-1

私はMingwを使用していて、exeファイル-g ++ -nostdlib -o main.exe main.cpp -luser32から標準ライブラリのコードを削除してみます。はい、それは機能しますが、最初の機能は常にエントリーポイントになります。さて、必要なのは直接エントリシンボルを設定するだけです - g ++ -nostdlib -e WinMain -o main.exe main.cpp -luser32今私は "警告:エントリーシンボルWinMainを見つけることができません、デフォルトは00401000"になります。その後、最初の機能は再びエントリポイントになります。次に、nostdlibをnodefaultlibsに変更して、「未定義の「一部のオブジェクト」への参照」に関する多くのエラーメッセージを取得します。exeファイルから標準C++ライブラリを削除してください

質問:標準ライブラリコードを削除してプログラムエントリポイントを設定する方法はありますか?

PS g ++ --version - g ++(i686-posix-dwarf-rev0、MinGW-W64プロジェクトで構築)5.3.0。 main.cppに:

#include<windows.h> 

//this function called instead of WinMain 
int OtherFunction() 
{ 
    MessageBoxA(NULL,"OtherFunction","OtherFunction",MB_OK); 
    return 0; 
} 

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    MessageBoxA(NULL,"WinMain","WinMain",MB_OK); 
    return 0; 
} 
+0

extern "C" void WinMain() { // Code here ExitProcess(0); } 

やリンクを、なぜあなたはあなたの実行ファイルから標準ライブラリを削除しようとしていますか? – Borgleader

+0

はい、珍しいstdライブラリを削除したいです。わかりませんが、WinMainをextern "C"として宣言する必要があるかもしれません。そうでなければ、WinMain関数のリンカシンボルが "WinMain"ではないように装飾されます。または、リンカーコマンドに(コンパイラ固有の)装飾名を使用する必要があります。これが何であるかわからないなら、_C++ name decoration_を探している有名な検索エンジンを使ってください。例えば、 http://www.geeksforgeeks.org/extern-c-in-c/しかしTBH私はそれが非常に権威的なのかどうかはわかりません。しかし、正確ではないかもしれません。 HTH、バニー。 – barny

+0

barny:すでにextern "C"と-e WinMain @ 16を試しています。それも動作しません。 Borgleader:もっと小さなexeファイル用。 nostdlibを使用している場合は、3 KBのexeファイルがあります。私がnostdlibを使わないなら、私は16kbを手に入れます。私がsingle push_back(1)を使用している場合、私は68kbを得ます。私は少し迷惑です。 – Aso

答えて

1

はこのような何か試してみてください。ただ、好奇心から-e _WinMain

+0

警告:_WinMain @ 16にリンクして_WinMainを解決しています...しかし、それは動作します!ありがとう。 – Aso

+1

@Aso '@ 16'はおそらく、デフォルトの呼び出し規約がstdcallに設定されているからでしょうか?いずれにしても、CRTを使用していないとき、WinMain関数には4つではなくパラメータがあります。これらの4つのパラメータは、CRTによって生成される。 – Anders

関連する問題