【问题标题】:How to manage C++ dependencies如何管理 C++ 依赖项
【发布时间】: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


【解决方案1】:

我解决了这个问题,所以我要为我的问题写一个答案。 非常感谢所有提供帮助的人,尤其是 @Öö Tiib、@Joachim Pileborg。

问题是我在公共桥接库中包含了“私有”库。 (我在 bridge.h 中包含了“zmq.h”)。

由于我的头文件不包含该库中的任何内容,我已将“zmq.h”包含移动到 bridge.cpp 文件中。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2022-12-05
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2011-09-04
    • 2020-09-05
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多