警告:通过链接到Func@##来解析Func
Warning: resolving Func by linking to Func@##
我正在用以下代码构建一个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
(它会自动修复问题)。当与gcc
或g++
一起使用时,表示-Wl,--enable-stdcall-fixup
。
有关这些选项的详细信息,请查看Gnu链接器选项的2.1.1节。
相关文章:
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 不能在 if 语句 - c++ 中使用 void func 直接将字符串转换为大写
- 在扣除自动之前使用decltype(auto) <func>
- Understanding void func(A())
- DLL+导出类+模板成员func=未解析的外部符号.任何修复的机会
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- 为什么 decltype(declval()<T>.func()) 可以工作,而 decltype(&T::func) 不能工作?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- C++,如何将返回值的函数传递给 func
- 派生类中的'using Base<T>::func()'使得派生类之外无法访问'func'
- 为什么无法在 Cocoa 应用程序调用的 C++ func 中嵌入自定义 Python 模块
- __extern_inline func导致未定义的参考错误
- 在扣除C++14中的"auto"之前使用"auto func(int)"
- 有没有办法查看此语句"Student s3=func(s1, s4)"将调用哪个构造函数?
- 我们应该在带有 char *func(char *string) 的函数中返回什么?需要简要说明这与 c 中的 char
- int func(function <int(int)> F, int x)
- 重载的 'func(char*&)' 的调用是不明确的
- 在函数返回的 Func 中设置输入
- strcats func 崩溃应用程序