【问题标题】:How to set up nested library dependencies?如何设置嵌套库依赖项?
【发布时间】: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)
        • ...更多库

为了让一切都整洁有序,我希望 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


【解决方案1】:

将 Core.lib 更改为 DLL,否则正确的方法是据我所知显式链接 LibWrapper.DLL 中的所有依赖项。

Somewhat related as it deal with why.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多