【问题标题】:Creating c++ .lib project, consumer project has to reference the libs includes创建 c++ .lib 项目,消费者项目必须引用包含的库
【发布时间】:2017-09-15 14:43:02
【问题描述】:

所以我很确定我的设计/设置有问题。但基本上在visual studio中,我想创建一个松散包装第三方代码的.lib项目,这部分很简单。

但是我发现当我在我的其他项目中使用 lib 时(在这种情况下是一个 dll,很容易成为不同项目中的一个 exe 等),该 dll 项目抱怨它需要相同的包含目录库项目。这似乎......没有帮助。 我有点明白为什么它会显示该消息,因为我包含了我的库中的标头,而这又包含了第 3 方包含文件...

对此有更好的设计建议吗?或者在visual studio中链接两个项目的更好方法。

我的消费者 dll,确实引用了我的 lib 的包含目录,并且我添加了项目作为参考,因此也应该设置 lib 输出。

帮助可视化

第 3 方代码 -> 我的包装器库 -> 我的 dll 使用者。

看起来我的消费者代码是否应该包含我的包装项目要抽象掉的相同头文件。

【问题讨论】:

    标签: c++ visual-studio-2017 lib


    【解决方案1】:

    我从我的库中包含了一个标头,这反过来又包含了第 3 方包含文件...

    这就是问题所在,当然,如果您尝试包含该标头,无论是直接还是通过另一个标头间接包含该标头。

    您应该为您的 lib 的用户生成一个新标头,其中 包含您向用户公开的函数,并且不包括任何其他函数或内部函数的其他标头你正在尝试包装。然后,您的 lib 的用户可以只包含此标头,其中将包含他们需要的所有定义。

    【讨论】:

    • 我想我明白你的意思,现在我只是想知道如何做到这一点,而不包括 3rd 方标头,在我的标头中暴露给我的 dll 的使用者。跨度>
    • @nagates,这是在 h 和 cpp 之间拆分代码的问题。 h 应该只包含接口细节,cpp - 实现。这可能会有所帮助:stackoverflow.com/questions/843389/the-pimpl-idiom-in-practice
    • @KonstantinL,如果您将实现放在 cpp 文件中,那么您的用户会创建您的类型吗?您可以包含接口标头,但消费者代码如何知道实现该接口(使用第 3 方代码)的更具体的类。
    • 接口中使用的任何具体类型也需要包含在提供给用户的标题中。这就是@KonstantinL 提到的 PIMPL 习惯用法的原因,当使用 PIMPL 时,您的接口将尽可能使用引用/指针,因此您主要可以只在标头中包含前向声明。尽管您当然需要包含用户实际需要访问的任何类的完整定义(而不仅仅是传递给函数)。
    • 我听说过这种 PIMPL 模式,看来我需要多读一点才能完全理解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多