如何在Visual Studio中从一个项目继承项目依赖关系/引用到一个依赖项目中

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文件。我如何使我的项目1静态库将构建的Boost regex库和GLM包含文件并入其中?FYI,项目2是项目1的测试项目。我想要类似于以下内容的东西:

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

(Boost unit test lib + Project_1.lib) --> 项目2 ==> Project_2.exe

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

这可能吗?我在这个问题上一直在忙碌中,遇到了更多的编译错误和链接错误,数不胜数。


你在项目2中的源文件中是否包含来自项目1的头文件?这些来自项目1的头文件是否直接或间接地包含了Boost和/或GLM的头文件? - Andrew Durward
是的,我在项目2中有一个文件,它有一个包含:#include "MyFileReader"我的"MyFileReader"同时包含了Boost和GLM。GLM是一个仅有头文件的库。 - Wagan8r
那么我会像Preet建议的那样,使用前向声明和/或PIMPL惯用语来防止将Project 1的实现细节暴露给其消费者。 - Andrew Durward
2个回答

5
这可能是因为你的Project 2中的某些代码(头文件和/或实现)包含了来自Project 1的头文件,而这些头文件又包含了不在Project 2的包含路径中的外部库头文件。其结果是,在扩展所有#include之后,你的Project 2源文件将有一行类似于:#include <boost/something/etc>,但由于它不在Project 2的包含搜索路径中,所以无法扩展它。
即使你已经将这些外部库静态编译到了你的project1.lib中,这个错误也会发生。
如果这不是问题,只需将外部库包含路径添加到Project 2的VC++目录中的包含目录中即可。
解决此问题的一种方法是将尽可能多的外部库包含移到Project 1头文件之外,并使用PIMPL模式和前向声明来隐藏它们。但对于像头文件仅或模板重的库,我认为你需要包含这些头文件路径,除非你将功能封装或将实现隐藏在Project 1类/接口背后,否则没有办法绕过它。

谢谢。我已经让我的依赖项目包含了所需的代码。PIMPL和前向声明看起来都是很好的想法,但我不想为了编译而重写大量代码。不过这些知识对我来说还是很有用的。 - Wagan8r

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接