微软Visual Studio 2012 C++循环引用问题

4

我有一个问题要问。在同一个解决方案下,项目之间是否可以相互引用?

例如,项目A和B都有自己的导出函数。项目A引用项目B,项目B引用项目A。两个项目都需要访问彼此的导出函数。

从技术上讲,这是否可能?


你的意思是只从代码中还是整个解决方案中查找?比如项目依赖关系?如果是后者,那么不行,你会发现无法通过后一种方法引入项目依赖关系。需要从项目菜单中操作。 - EdChum
不是在VisualStudio中,但在导入级别可以实现,尽管它会比值得付出的努力要困难得多。例如,您可以从EXE导出函数,当加载时,DLL可以链接到这些函数。这样,您的DLL就可以立即访问EXE中的功能,而无需进行大量的设置和手动初始化。可以研究一下创建.DEF文件并从中生成导入库(LIB)。不确定这是否是您想要的。 - Captain Obvlious
我刚刚尝试了这个,但是依赖项目被禁用了。当你尝试这个操作时,弹出对话框会告诉你:“无法添加此依赖项,因为它将创建循环依赖关系”。 - EdChum
@CaptainObvlious,我将研究创建 .DEF 文件的方法。但是,我想我会选择将相关的导出函数作为另一个 DLL,并使用项目 A 和 B 对其进行引用。谢谢。 - Wallace
将所有通用代码放在第三方库中肯定是最佳选择。 - Captain Obvlious
显示剩余2条评论
2个回答

1
据我理解,这是不可能的。如果两个项目A和B相互引用,它们将成为同一个项目 - 不清楚什么样的项目需要这种结构。

1

从技术上讲,这是可能的,但它存在问题。

当您构建2个DLL时,DLL A需要B的lib文件,而B需要A的lib文件。

我们是这样做的:第一个项目A不依赖于B,只有B依赖于A。A导出了2个函数funcA1和funcA2,当我们可以构建DLL A时,我们可以构建B并生成B.lib。由于我们有了B.lib文件,因此我们可以让A依赖于B并添加代码来使用B导出的函数。这就是我在真实项目中创建循环引用的方式。

问题是:当您清除所有lib文件并进行重建时,您将无法完成。我不喜欢这种方法,我们应该将相关函数放入另一个DLL中,而不是创建循环引用。


实际上,解决这个问题的一种方法是创建一个第三个项目(项目C),使用自定义构建命令从DEF文件创建一个导入库。然后使项目A和项目B依赖于项目C。这样导入库就会在正确的时间构建完成。 - Captain Obvlious
@Matt:谢谢你的解释。我预见到在重建时会出现循环引用问题。他们不会允许这样做。我采纳了将相关函数放入另一个DLL(项目C)中,而A和B项目则引用C的建议。 - Wallace

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