2013-06-04 4 views
4

Я строю DLL следующим:Предупреждение разрешения Func путем ссылки на Func @ ##

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 путем ссылки на _DrawMouse @ 24

Почему? Почему это предупреждает меня о разрешении и как я могу избавиться от него? Для большого объема экспорта, я получаю большое количество предупреждения ..

Небольшого примера:

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 [email protected] 
Warning: resolving _DrawMouse2 by linking to [email protected] 
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 НЕ работает. Вот почему я спрашиваю, как исправить это и избавиться от этих предупреждений, а также от того, что их вызывает.

EDIT:

Командная строка с fixups по запросу:

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 

Ни работы.

+0

Как выглядит ваш исходный код, который вызывает DrawMouse? –

+1

В частности, заголовочный файл, который объявляет его ... –

+0

Спасибо, что нашли время ответить. Я обновил сообщение с примером примера, а также с журналом компилятора с командами. – Brandon

ответ

4

Вам необходимо указать --enable-stdcall-fixup на компоновщик (который автоматически устраняет проблему). При использовании с gcc или g++ это означает -Wl,--enable-stdcall-fixup.

Подробнее об этих вариантах см. В разделе 2.1.1 от Gnu Linker options.

Смежные вопросы