【问题标题】:Dynamic and static linking and deployment in Visual Studio 2010Visual Studio 2010 中的动态和静态链接和部署
【发布时间】:2012-03-22 23:32:58
【问题描述】:

我在 Visual Studio 2010 中有一个非托管 C++ 项目。它使用 boost、glut 和来自供应商的另一个库。

我已经设置项目以创建一个更“独立于 dll”的可执行文件。所有的boost库都是静态链接的,可执行文件所在的目录不需要dll。

对于 Glut 也是如此,我已经链接了静态 glut32.lib 而不是 glut32.dll,同样没有问题。

我为运行时库选择了非 dll 版本,即多线程调试(用于调试配置)和多线程用于发布配置。

现在,我之前所说的供应商提供了两个替代方案,一个 Vendor.lib 和一个 Vendor.dll。

Vendor.lib 被添加到 Linker->Additional dependencies 但在运行时我总是必须将 Vendor.dll 放在可执行文件的同一目录中,否则运行时环境会因为找不到 Vendor 而报错。 dll 库。

我应该如何解决这个问题?我想避免将 .dll 文件放在每个目录中。

我不想将 dll 放在 exe 的同一目录中,一般来说,在 Visual Studio 中部署非托管 c++ 控制台应用程序的准则是什么?

我知道关于这个论点有很多问题和页面,但没有一个能澄清我这一点。

有什么想法吗?

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ deployment static-linking


    【解决方案1】:

    微软在处理这个问题的方式上有点滑稽:当你创建一个 .dll,您还可以创建一个 .lib,其中包含 .dll。您必须链接到 .lib 才能在以下位置加载 .dll 运行时,但这个 .lib 仍然不是静态库。如果您的供应商 提供静态链接的版本,要么没有.dll,要么 两个.lib(大概在不同的目录或不同的名称)。 微软使严肃开发变得更加重要的另一个例子 比必要的困难。

    【讨论】:

    • 这不是 MS 特定的。 Linux 也有导入库。
    • Unix 有两种类型的“库”:库(.a 文件)和共享对象(.so 文件)。提供库(一般意义上)的供应商通常会同时提供两者。如果链接 .a 文件,则链接静态,如果链接 .so,则链接动态。 Microsoft 解决方案的问题在于 1) 您有两个不同的文件用于动态链接,以及 2) 其中一个文件与静态库具有相同的名称。
    • 感谢您的回答。可能我不是唯一一个对这个话题感到困惑的人。因此,正如您所说,有两种 .lib 文件,一种是在需要动态库时创建的,另一种可以是静态库。我没有找到另一个 Vendor.lib 文件,所以我想我是第一种情况……谢谢!
    【解决方案2】:

    Vendor.lib 需要是静态编译的库。如果你在链接的时候还需要 Vendor.dll,听起来 Vendor.lib 实际上是一个导入库而不是静态库。

    检查供应商是否提供了另一个 Vendor.lib(应该比您当前的 .lib 大一点),它是一个静态库,并尝试链接到该库。如果是这样,您将不需要 dll。

    【讨论】:

    • 不幸的是,我在该库中没有其他 .lib 文件,所以我想我处于动态链接案例中。没有其他方法可以包含 .dll,而不是将其复制到可执行目录中(或将它们复制到 System32 文件夹中?)
    • 如果您可以访问供应商源代码,您可以自己编译 vendor.lib 作为静态库。否则,如果您必须使用共享库,那么您的 exe 需要在运行时访问它,这意味着将其添加到带有 exe 的文件夹中,或者将其放入包含在 %PATH% 中的文件夹中(约定是System32 文件夹)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多