2

我正在使用 mingw 编译器和代码块 IDE。我面临一个问题,我不明白我的 dll 是如何在没有我使用__declspec(dllexport)这些函数的情况下导出每个函数的。这是两个示例文件,main.hmain.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 文件中。

这里发生了什么?如果我犯了技术错误,请帮助并纠正我。

4

2 回答 2

3

MinGW 链接器将所有符号公开,除非您将它们默认隐藏。这可以从 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.
于 2011-02-18T12:02:06.560 回答
0

I don't know the MinGW linker or CodeBlocks, but the other way a function can be exported is through a .def file. Do you have a .def file that lists SomeFunction that you are passing into the linker?

(This looks like the VC++ DLL template, which does IIRC include a .def file with those exports)

于 2011-02-18T11:09:42.707 回答