将头文件编译成DLL

Posted

技术标签:

【中文标题】将头文件编译成DLL【英文标题】:Compiling a Header file into a DLL 【发布时间】:2015-08-21 19:27:31 【问题描述】:

我创建了一个函数库,我想从中创建一个 DLL 并创建一个导出库。创建 DLL 不是问题。

问题是,我不希望开发人员/用户查看头文件内部,因为代码没有优化,而且其中一些看起来很乱,即使它可以工作。

我是否可以将头文件的内容包含在另一个 DLL 中,以便隐藏头文件,或者有没有办法将头文件编译为二进制?

Win32,Visual Studio 2010,'c/c++'。

【问题讨论】:

如何将可怕的实现从头文件移到 DLL 中。 我同意 WhozCraig。头文件定义了允许 C/C++ 应用程序在 DLL 中创建的函数。所以你必须给开发者头文件。如果里面有你不想让他们看到的东西,并且不影响他们使用 DLL 的能力,那么把它从头文件中取出,它可能一开始就不属于那里。 呃,DLL 是您将源代码编译成的二进制文件 干净易读的标题是你的朋友。当文档很糟糕时,他们通常是你唯一的朋友。请不要从我们其他可怜的软件作者那里得到最后的帮助。当我们不必猜测时,我们可以编写更好的代码。 【参考方案1】:

首先,从头文件中删除代码:只需声明函数并指定类(即其中没有代码):

//header 
void my_ignomous_function(int);
class my_ignomous_class 
public: 
     my_ignomous_class();
     ~my_ignomous_class();
     bool my_ignomous_member(my_ignomous_class &x); 
private: 
     // unfortunately, you have to give these details.  
;

如果这还不够,您可以使用pimpl idiom:在您的类中,您使用指向用于实现的对象的指针。优点是您可以只在标头中声明实现类而无需任何详细信息。仅在实现中需要详细信息。

//header 
class my_nice_class 
public: 
     my_nice_class()
     ~my_nice_class()
     bool my_nice_member(my_nice_class &x); 
private: 
     class my_horrible_secret_class *impl; 
;

另一种方法是微调你的设计,这样你就没有什么可隐藏的了 ;-)

【讨论】:

额外的道具,如果我可以投票两次来演示 pImpl,但我会将 pimpl (snerk) 弹出到 unique_ptr 中,以获得从三合规规则中获得的额外温暖和模糊的感觉。跨度> 我建议不要从 DLL 导出 C++ 实现。很难遵守 CRT 施加的限制(请参阅Potential Errors Passing CRT Objects Across DLL Boundaries)。添加不可见的代码路径(例如,通过传递 freestore 支持的容器引用或抛出异常对象)不会改善这种情况。

以上是关于将头文件编译成DLL的主要内容,如果未能解决你的问题,请参考以下文章

编译生成的h.gch文件是什么鬼?

动态和静态链接库

将头文件中的 typedef 枚举包含在另一个头文件中

Xcode 4:为啥我不能将头文件添加到单元测试目标?

使用 automake 将头文件放在 /usr/include 的子目录中?

在 Qt 中链接 obj 文件