2016-05-25 2 views
0

Я подготовил очень простую DLL-программу на C++, в Windows 7 64-bit. Я сделал две версии, 64-битные и 32-разрядные. 32-битный проект, который я компилирую с компоновщиком и компилятором, с флагом -m32. Я использую -std=c++11. Вот его код:Компиляция 64-разрядной библиотеки DLL с CodeBlocks дает ошибки компоновщика

main.h

#ifndef __MAIN_H__ 
#define __MAIN_H__ 

#include <windows.h> 

/* To use this exported function of dll, include this header 
* in your project. 
*/ 

#ifdef BUILD_DLL 
    #define DLL_EXPORT __declspec(dllexport) 
#else 
    #define DLL_EXPORT __declspec(dllimport) 
#endif 


#ifdef __cplusplus 
extern "C" 
{ 
#endif 

void DLL_EXPORT SomeFunction(const LPCSTR sometext); 

#ifdef __cplusplus 
} 
#endif 

#endif // __MAIN_H__ 

main.cpp

#include "main.h" 

// a sample exported function 
void DLL_EXPORT SomeFunction(const LPCSTR sometext) 
{ 
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION); 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    switch (fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      MessageBoxA(0, "DLL_PROCESS_ATTACH", "DLL Message", MB_OK | MB_ICONINFORMATION); 
      break; 

     case DLL_PROCESS_DETACH: 
      MessageBoxA(0, "DLL_PROCESS_DETACH", "DLL Message", MB_OK | MB_ICONINFORMATION); 
      break; 

     case DLL_THREAD_ATTACH: 
      MessageBoxA(0, "DLL_THREAD_ATTACH", "DLL Message", MB_OK | MB_ICONINFORMATION); 
      break; 

     case DLL_THREAD_DETACH: 
      MessageBoxA(0, "DLL_THREAD_DETACH", "DLL Message", MB_OK | MB_ICONINFORMATION); 
      break; 
    } 
    return TRUE; // succesful 
} 

DLL, компилируется нормально и хорошо работает в 32-разрядной версии. Но когда я скомпилирую до 64-битного, удалив опцию -m32 на все, я получаю ошибку компоновщика:

obj \ Release \ main.o: main.cpp || undefined ссылка на `_imp_MessageBoxA '|

Замена -m64 не помогает. Вот моя информация о версии MingW:

Using built-in specs. 
COLLECT_GCC=x86_64-w64-mingw32-g++.exe 
COLLECT_LTO_WRAPPER=E:/Program\ Files\ (x86)/CodeBlocks/MinGW/bin/../libexec/gcc/x86_64-w64-mingw32/5.1.0/lto-wrapper.exe 
Target: x86_64-w64-mingw32 
Configured with: ../../../src/gcc-5.1.0/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=http://tdm-gcc.tdragon.net/bugs 
Thread model: posix 
gcc version 5.1.0 (tdm64-1) 

Что я могу делать неправильно? Может быть, мне нужно включить специальный 64-битный заголовок Windows? Большое спасибо за любое направление! :)

+1

Я знаю, это просто для тестирования, но не вызывайте 'MessageBox' из' DllMain' (см. [Рекомендации по наилучшей библиотеке динамических ссылок] (https://msdn.microsoft.com/en-us/library/ окна/настольные/dn633971.aspx)). Однако вызов [OutputDebugString] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx) является безопасным. В стороне, поскольку вы используете Code :: Blocks и подвергаетесь его плохим настройкам по умолчанию: вы должны абсолютно, положительно назвать Unicode-версии Windows API (т. Е. 'MessageBoxW' вместо' MessageBoxA'). – IInspectable

+0

Отлично, спасибо! – bombax

ответ

0

Исправлено, я идиот. Давным-давно я установил -m32 как постоянный флаг в настройках компоновщика в разделе «Компилятор и отладчик». Удалено, теперь отлично работает.

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

  • Нет связанных вопросов^_^