警告:通过链接到Func@##来解析Func

Warning: resolving Func by linking to Func@##

本文关键字:Func Func@## 链接 警告      更新时间:2023-10-16

我正在用以下代码构建一个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 srcTest.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:UsersBrandonDesktopTestmain.cpp -o objReleasemain.o
x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=binReleaselibTest.def -Wl,--out-implib=binReleaselibTest.a -Wl,--dll  objReleasemain.o   -o binReleaseTest.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:UsersBrandonDesktopTestmain.cpp -o objReleasemain.o
x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=binReleaselibTest.def -Wl,--out-implib=binReleaselibTest.a -Wl,--dll  objReleasemain.o   -o binReleaseTest.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:UsersBrandonDesktopTestmain.cpp -o objReleasemain.o
x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=binReleaselibTest.def -Wl,--out-implib=binReleaselibTest.a -Wl,--dll  objReleasemain.o   -o binReleaseTest.dll -s -static -static-libstdc++ -static-libgcc -Wl,--kill-at -d --input-def Test.def -m32 --enable-stdcall-fixup  -luser32 

无论是作品。

您需要向链接器提供--enable-stdcall-fixup(它会自动修复问题)。当与gccg++一起使用时,表示-Wl,--enable-stdcall-fixup

有关这些选项的详细信息,请查看Gnu链接器选项的2.1.1节。