我们有一个相当大的解决方案(总共包含 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依赖的库,我将“Reference assembly output”和“Link library dependencies”设置为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 添加一行。这不是很好,但可行。
但是,我仍然更喜欢更好的解决方案。有人知道吗?
最佳答案
将 Core.lib 更改为 DLL,否则据我所知,正确的方法是显式链接 LibWrapper.DLL 中的所有依赖项。
关于.net - 如何设置嵌套库依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7721773/