在一个使用 server.dll 和 client.exe 的项目中,我从 server dll 中使用了 dllexport 导出了一个 server 符号,并且没有将其用 dllimport 导入到 client exe 中。
尽管如此,该应用程序链接并启动时都没有出现任何问题。因此,dllimport 不需要使用吗?
详细信息:
我有这个“server”dll:
尽管如此,该应用程序链接并启动时都没有出现任何问题。因此,dllimport 不需要使用吗?
详细信息:
我有这个“server”dll:
// 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;
还有这个客户端可执行文件:
#include <server.h>
int main() {
CServer s;
}
服务器的命令行:
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
客户端命令行:
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
extern
(带有正确的调用约定和名称重整)和指定导入库是否有任何好处。 - peterchen__declspec(dllexport)
非常脆弱。单独的server.dll是什么目的?实际上,类上的__declspec(dllexport)
唯一做得好的事情就是在与/delayload:server.dll
配对时减少进程启动I/O。任何其他认为的优点(例如想象中的能够在不重新编译应用程序的情况下修补DLL逻辑的能力)都违反了One-Definition-Rule且不可靠。 - Ben Voigt