我们最近升级到Visual Studio 2010有一个相当大的解决方案(总共包含40个项目)。升级时,我认为清理项目依赖项可能是个好主意。这是我似乎无法做到的。
主.exe(C#)依赖于包装非托管C ++库项目的C ++ / CLI项目,该项目本身依赖于多个第三方库。所以依赖树看起来像这样:
为了让一切都干净整洁,我希望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添加一行。这不好,但可行。
但是,我仍然更喜欢更好的解决方案。有谁知道吗?
答案 0 :(得分:0)
将Core.lib更改为DLL,否则正确的方法是在我知道的情况下明确链接LibWrapper.DLL中的所有依赖项。