c++ - ¿Por qué/cuándo no se necesita__declspec(dllimport)?
visual-c++-2005 (1)
No es requerido Es una optimización, una sugerencia para el compilador de que el archivo DLL va a exportar el puntero a la función directamente en lugar de solo una entrada en el IAT de la DLL. El puntero de función exportado para una función llamada foo () será __imp_foo. Lo que le permite generar un mejor código, guardando una carga del puntero de función del IAT y un salto indirecto. Es una optimización de tiempo, no de espacio.
Esta publicación de blog tiene los detalles.
En un proyecto que usa un server.dll y un client.exe, tengo dllexport
ed un símbolo de servidor del servidor dll, y no lo dllimport
al exe del cliente.
Aún así, la aplicación vincula, y comienza, sin ningún problema. ¿No se necesita dllimport
, entonces?
Detalles:
Tengo este dll ''servidor'':
// server.h
#ifdef SERVER_EXPORTS
#define SERVER_API __declspec(dllexport)
#else
#define SERVER_API // =====> not using dllimport!
#endif
class SERVER_API CServer {
static long s;
public:
CServer();
};
// server.cpp
CServer::CServer(){}
long CServer::s;
y este ejecutable cliente:
#include <server.h>
int main() {
CServer s;
}
La línea de comando del servidor:
cl.exe /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL"
/D "SERVER_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL"
/Gm /EHsc /RTC1 /MDd /Yu"stdafx.h"
/Fp"Debug/server.pch" /Fo"Debug//" /Fd"Debug/vc80.pdb"
/W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt
cl.exe /OUT:"U:/libs/Debug/server.dll" /INCREMENTAL:NO /NOLOGO /DLL
/MANIFEST /MANIFESTFILE:"Debug/server.dll.intermediate.manifest"
/DEBUG /PDB:"u:/libs/Debug/server.pdb"
/SUBSYSTEM:WINDOWS /MACHINE:X86 /ERRORREPORT:PROMPT
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
Línea de comando del cliente:
cl.exe /Od /I "../server"
/D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE"
/Gm /EHsc /RTC1 /MDd /Fo"Debug//" /Fd"Debug/vc80.pdb" /W3 /c /Wp64 /ZI /TP
./client.cpp
cl.exe /OUT:"U:/libs/Debug/Debug/client.exe" /INCREMENTAL
/LIBPATH:"U:/libs/Debug"
/MANIFEST /MANIFESTFILE:"Debug/client.exe.intermediate.manifest"
/DEBUG /PDB:"u:/libs/debug/debug/client.pdb"
/SUBSYSTEM:CONSOLE /MACHINE:X86
server.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib