将头文件编译成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的主要内容,如果未能解决你的问题,请参考以下文章