4

私は次のDLLを構築しています:

extern "C" __declspec(dllexport) void __stdcall DrawMouse(int X, int Y, int R, int G, int B)
{
    Buffer.SetMouse(X, Y, R, G, B);
}

次に、.def ファイルに次のように追加しました。

LIBRARY Test
;DESCRIPTION "Test Definition File"
EXPORTS

DrawMouse;

次に、コンパイル時にリンカー オプションを追加します。

-static
-static-libstdc++
-static-libgcc
-Wl,--kill-at -d --input-def src\Test.def
-m32

出力は次のとおりです。

警告: _DrawMouse@24 にリンクして _DrawMouse を解決しています

なんで?解決に関する警告が表示されるのはなぜですか? また、どうすればそれを取り除くことができますか? 大量のエクスポートの場合、大量の警告が表示されます..

小さな例:

Main.cpp:

#include <windows.h>

class Input
{
    public:
        void SetMouse(int X, int Y, int R, int G, int B)
        {
            /**Dummy Example**/
        }
};



Input Buffer;
extern "C" void __stdcall SetMouse2(int X, int Y, int R, int G, int B)
{
    /**Dummy Non-Class Example**/
}

extern "C" __declspec(dllexport) void __stdcall DrawMouse(int X, int Y, int R, int G, int B)
{
    Buffer.SetMouse(X, Y, R, G, B);
}

extern "C" __declspec(dllexport) void __stdcall DrawMouse2(int X, int Y, int R, int G, int B)
{
    SetMouse2(X, Y, R, G, B);
}

extern "C" __declspec(dllexport) bool __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            DrawMouse(100, 100, 1, 1, 1);
            DrawMouse2(100, 100, 1, 1, 1);
            break;

        case DLL_PROCESS_DETACH:
            break;
    }
    return true;
}

Test.def:

LIBRARY Test
;DESCRIPTION "Test Definition File"
EXPORTS

DrawMouse;
DrawMouse2;

コンパイラ ログ:

-------------- Clean: Release in Test (compiler: GNU GCC Compiler)---------------

Cleaned "Test - Release"

-------------- Build: Release in Test (compiler: GNU GCC Compiler)---------------

x86_64-w64-mingw32-g++.exe  -O2  -Wall -m32 -DBUILD_DLL  -std=c++11    -c C:\Users\Brandon\Desktop\Test\main.cpp -o obj\Release\main.o

x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libTest.def -Wl,--out-implib=bin\Release\libTest.a -Wl,--dll  obj\Release\main.o   -o bin\Release\Test.dll -s -static -static-libstdc++ -static-libgcc -Wl,--kill-at -d --input-def Test.def -m32  -luser32 

Warning: resolving _DrawMouse by linking to _DrawMouse@20
Warning: resolving _DrawMouse2 by linking to _DrawMouse2@20
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups

Output size is 32.50 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings (0 minutes, 0 seconds)

注: --disable-stdcall-fixup は機能しません。これが、これを修正してこれらの警告を取り除く方法と、その原因を尋ねている理由です。

編集:

要求された修正を含むコマンド ライン:

x86_64-w64-mingw32-g++.exe  -O2  -Wall -m32 -DBUILD_DLL  -std=c++11    -c C:\Users\Brandon\Desktop\Test\main.cpp -o obj\Release\main.o

x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libTest.def -Wl,--out-implib=bin\Release\libTest.a -Wl,--dll  obj\Release\main.o   -o bin\Release\Test.dll -s -static -static-libstdc++ -static-libgcc -Wl,--kill-at -d --input-def Test.def -m32 --disable-stdcall-fixup  -luser32 

また試しました:

x86_64-w64-mingw32-g++.exe  -O2  -Wall -m32 -DBUILD_DLL  -std=c++11    -c C:\Users\Brandon\Desktop\Test\main.cpp -o obj\Release\main.o

x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libTest.def -Wl,--out-implib=bin\Release\libTest.a -Wl,--dll  obj\Release\main.o   -o bin\Release\Test.dll -s -static -static-libstdc++ -static-libgcc -Wl,--kill-at -d --input-def Test.def -m32 --enable-stdcall-fixup  -luser32 

どちらも機能しません。

4

1 に答える 1

4

いずれかをリンカーに提供する必要があり--enable-stdcall-fixupます (問題は自動的に修正されます)。gccまたはと一緒に使用する場合g++、これは を意味し-Wl,--enable-stdcall-fixupます。

これらのオプションの詳細については、Gnu Linker optionsのセクション 2.1.1 を確認してください。

于 2013-06-04T08:42:46.957 に答える