Visual Studio C++:何时应该使用__declspec(dllimport)?

8
我有一个关于在Visual Studio 2005及更高版本中构建/链接DLL的问题。基本上,我的理解和经验是这样的:
要构建一个DLL,我需要指定项目属性以构建DLL,然后我需要在任何要从DLL公开暴露的函数或成员前加上__declspec(dllexport)。构建项目将会生成一个DLL、一个Lib和一个头文件,可以作为API等部署。
另一方面,为了使其他已编译的可执行应用程序动态链接到DLL并使用其函数,您只需要让可执行项目包含头文件并链接到在构建DLL时创建的小型lib文件即可。只要已编译的应用程序能够找到DLL,一切都会正常工作。
这是我的经验,也是Microsoft DLL构建教程在MSDN上描述所有内容的方式。我想知道:这是标准做法吗?何时需要在任何地方使用__declspec(dllimport)?我有什么遗漏的吗?
谢谢!

可能是重复的问题:[__declspec(dllimport)何时/为什么不需要?](https://dev59.com/Ym855IYBdhLWcg3wMBLV) - Hans Passant
1个回答

14

是的,你需要使用 __declspec(dllimport) ,通常还有一个宏来控制源文件是导出符号(如果它是 DLL 的一部分)还是导入符号(如果它是使用可执行文件的一部分)。

在你的 DLL 中,你可以设置一个清单常量来构建某种类型的设置,比如 'BUILDING_MY_DLL',然后在你的头文件中创建这样的宏:

#ifdef BUILDING_MY_DLL
#define MY_DLL_EXPORT __declspec(dllexport)
#else
#define MY_DLL_EXPORT __declspec(dllimport)
#endif

然后像这样装饰您导出的函数:

MY_DLL_EXPORT int func(int y);

你也可以用这种方式导出整个类:

class MY_DLL_EXPORT InterestingClass
{
...
};

2
非常好的答案,谢谢!我查看了一些DLL的源代码,它们似乎都是按照您指定的方式设计的。不过我还在想,为什么这个MSDN Microsoft教程的代码可以不使用__declspec(dllimport)就能运行?-> http://msdn.microsoft.com/en-us/library/ms235636.aspx - Russel
4
@Russel:dllimport不是必须的,但我认为这是最佳实践。请参见此链接:https://dev59.com/Ym855IYBdhLWcg3wMBLV - trojanfoe
1
请参阅动态链接库演练:创建和使用动态链接库 (C++)。这些内容在其中有更详细的解释。我的静态链接与动态链接可能会有所帮助。 - Sam Hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接