如何设置嵌套库依赖项?

时间:2011-10-11 05:35:06

标签: .net c++ visual-studio-2010 c++-cli

我们最近升级到Visual Studio 2010有一个相当大的解决方案(总共包含40个项目)。升级时,我认为清理项目依赖项可能是个好主意。这是我似乎无法做到的。

主.exe(C#)依赖于包装非托管C ++库项目的C ++ / CLI项目,该项目本身依赖于多个第三方库。所以依赖树看起来像这样:

  • App (C#.exe)
    • LibWrapper (C ++ / CLI .dll)
      • CoreLib (C ++ .lib)
        • libjpeg (C .lib)
        • libpng (C .lib)
        • ... 更多libs

为了让一切都干净整洁,我希望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添加一行。这不好,但可行。

但是,我仍然更喜欢更好的解决方案。有谁知道吗?

1 个答案:

答案 0 :(得分:0)

将Core.lib更改为DLL,否则正确的方法是在我知道的情况下明确链接LibWrapper.DLL中的所有依赖项。

Somewhat related as it deal with why.