【发布时间】:2015-01-16 23:06:55
【问题描述】:
我对通过库和 dll 进行的 C++ 依赖项管理相当陌生。 我完全理解静态和动态链接之间的区别(我猜)这就是我问这个的原因,因为常见的答案通常与不理解差异的问题有关。 我正在使用 Visual Studio,我当前的项目是这样设置的:
Bridge 项目:这是一个导出几个类的 dll 项目。这充当了网络代码和应用程序代码之间桥梁的共享库。 自然,它有自己的依赖项(ZMQ 网络库、MsgPack 序列化等),它们是静态链接的(使用 .lib 文件)。我的 .dll 是正常生成的,它也是导出的 .lib 文件。 (在我切换到 dll 项目之前,我一直将其编译为 .exe 以测试我编写的代码......)
App 项目:该项目是一个应用项目,希望使用桥接器通过桥接器获得对网络功能的完全访问权限。所以我向它添加了 .lib 依赖项,我知道我必须将 .dll 提供给 .exe
但是我的问题是,应用程序无法编译,因为它缺少 ZMQ 中的头文件(这是一个桥接 .dll 依赖项,与应用程序根本不相关,因为只有桥接内部 BL 使用它们)。 有什么方法可以“烘焙”/包括我对桥 dll(ZMQ、MsgPack、Log4cpp ......)的所有必需依赖项,并将 -just-bridge.dll 提供给应用程序(ofc,使用 bridge.lib 作为库输入)? 我是否在这里误解了一些明显的东西并且完全错误的方式?
感谢您的帮助,非常感谢:)
【问题讨论】:
-
为什么你需要一个bridge-dll,而不仅仅是你的应用程序直接链接到所有需要的东西?
-
如果您缺少 headers,很可能您导出了桥依赖项中定义的内容,而不是桥本身。然后自然需要包含标题。
-
阅读编译器防火墙、不透明指针、pimpl idiom 以了解摆脱需要包含间接依赖的标头的典型方法。
-
不要在桥接库公共头文件中包含“私有”头文件。
-
感谢 Tiib 和 Pileborg,您对我的问题很了解。不幸的是,我在桥中包含的库头文件没有我可以转发声明的任何类,而是有很多常量和函数。一般的 pimpl 习惯用法是否仍然适用于函数和常量,或者有没有更好的实践向前声明大量函数?
标签: c++ dll visual-studio-2013