.net - 如何设置嵌套库依赖?

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

我们有一个相当大的解决方案(总共包含 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依赖的库,我将“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 中的所有依赖项。

Somewhat related as it deal with why.

关于.net - 如何设置嵌套库依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7721773/

相关文章:

c++ - WINAPI C++ VS 2008 与 VS 2010

c# - 添加页码参数时,Report Services 在本地报告的 visual studio 调试器中崩溃

c# - 退出全屏时视频不会调整到窗口大小

asp.net - 在隐藏列的 GridView 中隐藏垂直线

c++ - 为什么 C++ 参数范围会影响命名空间内的函数查找?

c++ - 在 Node.js 中使用 native 代码的最佳方式是什么?

c# - Visual C# 2010 命令行参数到 csc

c# - 这是使用泛型处理数据库中空值读取的安全有效方法吗?

c# - wpf 菜单选项卡停止奇怪的行为

c++ - 使用 CodeRunner 扩展通过 VStudio 代码运行 C++