【发布时间】:2011-10-11 05:35:05
【问题描述】:
我们有一个相当大的解决方案(总共包含 40 个项目),我最近升级到 Visual Studio 2010。升级时,我认为清理项目依赖项可能是个好主意。这是我似乎无法做到的。
主 .exe (C#) 依赖于包装非托管 C++ 库项目的 C++/CLI 项目,该项目本身依赖于多个第三方库。所以依赖树看起来像这样:
- 应用程序 (C# .exe)
- LibWrapper (C++/CLI .dll)
- CoreLib (C++ .lib)
- libjpeg (C .lib)
- libpng (C .lib)
- ...更多库
- CoreLib (C++ .lib)
- LibWrapper (C++/CLI .dll)
为了让一切都整洁有序,我希望 LibWrapper 仅依赖于 CoreLib,而 CoreLib 引用它的所有依赖项。我相应地设置了项目依赖项,从头开始重建解决方案时一切正常。到目前为止,一切顺利。
但是,当我在 LibWrapper 中更改某些内容然后尝试构建解决方案(并且只有 LibWrapper 被重新编译和链接)时,链接器不会获取嵌套的依赖项(libjpeg 和其他),因此会抛出一个无数的链接器错误。这在技术上是正确的,因为链接器无法找到符号,因为它根本不查看嵌套库。但是为什么在重建一切时它会按预期工作?
库依赖设置可能有问题,但我不知道是什么。我可以将 CoreLib 依赖项添加到 LibWrapper,但恕我直言,这有点难看。
对于 CoreLib 所依赖的库,我将“参考程序集输出”和“链接库依赖项”设置为 false。对于 LibWrapper 中的 CoreLib 依赖,我将两者都设置为 true。
更新我发现了一个相当丑陋的解决方法,它至少可以工作,虽然它不是很好维护。因此,对于每个具有依赖项的 lib 项目,我添加了一个列出这些依赖项的头文件。因此,例如,对于 CoreLib,文件如下所示:
// NestedDependencies.h
#pragma once
// add nested dependencies
#pragma comment(lib, "libjpeg")
#pragma comment(lib, "libpng")
// more libs..
在依赖项目中,我包含来自 stdafx.h(或其他中心位置)的此标头:
// stdafx.h
#pragma once
#using <mscorlib.dll>
#include <vcclr.h>
#include <windows.h>
#include <atlbase.h>
// whatever else
// add nested dependencies
#include "CoreLib/NestedDependencies.h"
至少这是可行的,尽管我们团队中的每个人都必须记住在添加库依赖项时向 NestedDependencies.h 添加一行。这不是很好,但可行。
但是,我仍然希望有更好的解决方案。有人知道吗?
【问题讨论】:
-
没人?这是否意味着没有其他人有这个问题,或者没有人知道一个好的解决方案?还是只是没有人再使用这种拜占庭式的解决方案了? ;-)
标签: .net c++ visual-studio-2010 c++-cli