【问题标题】:How can I inherit project dependencies/references from one project to a dependent project in Visual Studio如何将项目依赖项/引用从一个项目继承到 Visual Studio 中的依赖项目
【发布时间】:2012-08-27 08:25:41
【问题描述】:

我的项目 1 依赖于 Boost 和 GLM。对于 Boost 和 GLM,我指定了“附加包含目录”来引用每个的 C++ 文件。项目 1 被创建为静态库项目。当我构建项目 1 时,一切正常。项目 2 通过参考管理器引用了项目 1,但是当我构建项目 2 时,我得到了

fatal error C1083: Cannot open include file: 'boost/something/etc.

项目 1 中的文件。为什么我在构建项目 2 时会收到有关项目 1 的错误?项目 1 还使用了 Boost 中的 regex 库,在使用之前必须将其内置到 .lib 中。如何让我的 Project 1 静态库将内置的 Boost 正则表达式库和 GLM 包含文件合并到其中?仅供参考,项目 2 是项目 1 的测试项目。我想要这样的东西:

(Boost regex lib + GLM 包括)--> 项目 1 ==> Project_1.lib

(Boost 单元测试库 + Project_1.lib) --> 项目 2 ==> Project_2.exe

--> 表示依赖/引用,==> 表示输出。

这可能吗?我遇到的编译错误和链接器错误数不胜数。

【问题讨论】:

  • 项目 2 中的源文件是否包含项目 1 的头文件?项目 1 中的那些头文件是否包括(直接或间接)来自 Boost 和/或 GLM 的头文件?
  • 是的,我在项目 2 中有一个文件,它有一个包含:#include "MyFileReader" 我的 "MyFileReader" 包含 Boost 和 GLM。 GLM 是一个只有头文件的库,仅供参考。
  • 然后我会按照 Preet 的建议做,并使用前向声明和/或 PIMPL 成语来防止将项目 1 的实施细节暴露给消费者。

标签: c++ visual-studio-2010 boost dependencies dependency-management


【解决方案1】:

这可能是因为您的项目 2 中的某些代码(头文件和/或实现)包含来自项目 1 的头文件,这反过来又包含了项目 2 的包含路径中没有的外部库头文件。网络效果是,在展开所有 #includes 之后,您的 Project 2 源文件将有一行内容类似于:#include <boost/something/etc>,因为它不在 Project 2 的包含搜索路径中,因此无法展开。

无论您是否已将这些外部库静态编译到您的project1.lib 中,都会发生此错误。

如果不是问题,只需将外部库包含路径添加到项目 2 的 VC++ 目录 > 包含目录。

解决此问题的一种方法是将尽可能多的外部库包含在 Project 1 标头之外,并通过结合使用 PIMPL 模式和前向声明来隐藏它们。但是对于诸如仅标头或模板重的库之类的东西,我相信您将需要包含这些标头路径,除非您封装功能或将实现隐藏在 Project 1 类/接口后面,否则无法绕过它。

【讨论】:

  • 谢谢。我继续,只是让我的依赖项目包含引用的代码。 PIMPL 和前向声明看起来都不错,但我真的不想仅仅为了编译目的而重写一堆代码。不过,这是增加我知识的好东西。
【解决方案2】:

@PreetKukreti 的答案也是正确的,在你修复你的头文件后,还有一个对外部库(boost 和 GLM)的依赖,因为默认情况下静态库不会与外部依赖项链接。这是因为我将在这里解释一个简单的错误案例:
您使用 CRT 中的函数,例如 strlen,并且您希望将其与您的 .lib 输出合并,然后 strlen 将合并到您的 .lib 中,然后在您的测试项目(.exe)中您再次使用 strlen ,并且您已经知道在静态库中所有内容都是公开的,因此当您链接到 CRT 和您的 .lib 时,您必须实现 strlen,这将产生链接器错误。
因此,默认情况下,VisualStudio 不会将库依赖项链接到 .lib 文件中,除非您告诉它这样做(解决方案属性->图书馆员->链接库依赖项),除非您真的知道自己在那里做什么,否则不应将其设置为是并接受你行为的后果!!
因此,无论如何,最好将外部库(boost & GLM)的路径放入项目 2 的路径中,或者将项目 1 构建为仅公开某些指示对象的 DLL,并尝试使用来自@PreetKukreti 的答案并移动您不必要的包含文件到实现(.cpp)文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2015-07-08
    • 2019-12-19
    • 2021-10-03
    相关资源
    最近更新 更多