gpt4 book ai didi

c++ - 为什么/何时不需要 __declspec( dllimport )?

转载 作者:IT老高 更新时间:2023-10-28 12:34:35 25 4
gpt4 key购买 nike

在一个使用 server.dll 和 client.exe 的项目中,我从服务器 dll dllexported 了一个服务器符号,并且 不是 dllimport将其写入客户端 exe。

仍然,应用程序链接并启动,没有任何问题。是不需要dllimport,那么???

详情:

我有这个“服务器”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

最佳答案

这不是必需的。这是一种优化,是对编译器的提示,即 DLL 将直接导出函数指针,而不仅仅是 DLL 的 IAT 中的一个条目。名为 foo() 的函数的导出函数指针将是 __imp_foo。这允许它生成更好的代码,节省来自 IAT 的函数指针加载和间接跳转。这是时间优化,而不是空间。

这个 blog post有详细信息。

关于c++ - 为什么/何时不需要 __declspec( dllimport )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4489441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com