Моя dll экспортирует все функции без моего согласия! - PullRequest
2 голосов
/ 18 февраля 2011

Я использую компилятор mingw и IDE блоков кода. Я сталкиваюсь с проблемой, в которой я не понимаю, почему мой dll экспортирует каждую функцию без меня, даже используя __declspec(dllexport) с этими функциями. Вот два примера файлов: main.h и main.cpp:

main.h

#ifndef __MAIN_H__
#define __MAIN_H__
#include windows.h

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

#ifdef __cplusplus
extern "C"
{
#endif

void SomeFunction(const LPCSTR sometext);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp:

#include "main.h"


void SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL fxn Message", MB_OK | MB_ICONINFORMATION);
}

bool flag = false;

extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }

    flag = true;

    return TRUE; // succesful
}

В этом примере SomeFunction экспортируется, и я могу динамически вызывать его из приложения извне, хотя я не прототипировал его как

void __declspec(dllexport) SomeFunction(const LPSTR sometext);

Мало того, даже глобальная переменная flag экспортируется в автоматически сгенерированный файл .def.

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

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Компоновщик MinGW делает все символы общедоступными, если вы не сделаете их скрытыми по умолчанию. Это может быть отменено, с man-страницы GCC:

-fvisibility=default|internal|hidden|protected

...
 A good explanation of the benefits offered by ensuring ELF symbols
           have the correct visibility is given by "How To Write Shared
           Libraries" by Ulrich Drepper (which can be found at
           <http://people.redhat.com/~drepper/>)---however a superior solution
           made possible by this option to marking things hidden when the
           default is public is to make the default hidden and mark things
           public.  This is the norm with DLL's on Windows and with
           -fvisibility=hidden and "__attribute__ ((visibility("default")))"
           instead of "__declspec(dllexport)" you get almost identical
           semantics with identical syntax.  This is a great boon to those
           working with cross-platform projects.
0 голосов
/ 18 февраля 2011

Я не знаю компоновщика MinGW или CodeBlocks, но другой способ экспорта функции - через файл .def.Есть ли у вас файл .def, в котором содержится список SomeFunction, передаваемый в компоновщик?

(это похоже на шаблон DLL VC ++, в который IIRC входит файл .def с этими экспортами)

...