I am using a mingw compiler and code blocks IDE. I am facing a problem in which I don't understand how come my dll exports every function without me even using __declspec(dllexport)
with these functions. Here are the two sample files, main.h
and 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
}
In this example, SomeFunction
is exported and I am able to dynamically call it from an application externally, although I haven't prototyped it as
void __declspec(dllexport) SomeFunction(const LPSTR sometext);
Not only this, even the global variable flag
is exported in the auto generated .def file.
What is happening here? Please help and correct me if I am making a technical mistake.
The MinGW linker makes all symbol public unless you make them hidden by default. This can be overridden, from the GCC man-page:
-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.
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)
精彩评论