2013-12-15 32 views
1

我很困惑,为什么__declspec(dllexport)或同等需要在头文件中去。说我正在写一个图书馆。当然,用户不需要知道或担心符号是否被导出,他们关心的只是函数声明存在,并且可能会与共享库或静态库本身链接。那么为什么不能将所有这些样板文件放入源文件中,仅在构建时使用?dllexport在标题混淆

我想到的唯一用例是某人正在编写我的库的包装并需要导出所有函数的情况,但通常情况并非如此 - 是否真的值得将所有导出的东西放在公共头文件中?有什么我错过了,这是链接器的技术限制..?

我这么问是因为我喜欢我的头和构建系统是干净的,并作为dllexport东西一般设定/不设定基于我们是否建库为共享或静态库,我发现它奇怪的是,它应该最终进入公共头部,因为它(根据我的理解)基本上是一个构建时间的概念。那么有人可以请我启发我失踪?

回答

1

我不确定我能否提供一个很好的答案。我的印象是,它具有多种用途:

  1. 它加速的DLL,使用大量的DLL的尤其是当的加载(因为有更少的输出符号进行搜索)
  2. 它减少符号碰撞的可能性在运行时(这是因为减少出口符号)
  3. 它允许链接器抱怨未定义的符号(而不是仅仅假设它可能会在运行时找到它们。

我敢肯定还有其他的原因。我通常将我的API包装在一些东西中像这样:

#if defined(MY_LIB_CREATION) 
    #define MY_LIB_API __declspec(dllexport) 
#else 
    #define MY_LIB_API __declspec(dllimport) 
#endif 

然后我所有的API函数&类被定义为MY_LIB_API:

class MY_LIB_API Foo {}; 
MY_LIB_API void bar(); 

然后在项目文件中定义为实现您的图书馆项目MY_LIB_CREATION。