6

我有项目 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 包括)--> Project 1 ==> Project_1.lib

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

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

这可能吗?当我在这上面转动轮子时,我得到的编译错误和链接器错误比我能数的还要多。

4

2 回答 2

5

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

无论您是否已将这些外部库静态编译到您的project1.lib.

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

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

于 2012-09-04T15:56:22.753 回答
1

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

于 2012-09-06T00:31:11.273 回答