【问题标题】:Bundling a library with C++ exe将库与 C++ exe 捆绑在一起
【发布时间】:2020-12-15 09:16:45
【问题描述】:

我一直在从事一个项目,该项目使用名为 winsock 的 windows 套接字库。目前,我可以开发或运行此代码的唯一方法是在安装了 C++ 扩展的 Visual Studio 中执行此操作。编译后的 exe 也只能在安装了 Visual Studio C++ 的计算机上运行。

#pragma comment(lib, "ws2_32.lib")

以上行在 Visual Studio 中用于链接代码和 winsock 库。

我的问题是这个。我希望能够将所有这些“捆绑”在一起,这样我就可以把这个项目交给没有 Visual Studio 的人。我在网上搜索了一下,但不确定这里的情况与我的情况相关。

谁能指导我的程序?

【问题讨论】:

  • 如果您正在谈论分发,您需要make an installer 将其打包,尤其是对于可能没有该库的机器。如果您说的是其他人使用 Visual Studio,那么他们已经拥有该文件。
  • ws2_32.lib库为例,它不是一个完整的库,而是系统DLLws2_32.dll的配套库,每个Windows系统都应该有。 .lib 文件仅在链接我们的应用程序时使用,运行时从不需要这些文件。
  • 您正在寻找的概念是静态链接。不幸的是,微软没有通过 winsock 库实现这一点。
  • @john 不必是静态链接的,尽管这是捆绑它的一种方式。您可以将其作为软件包的一部分安装。不幸的是,这就是为什么大多数 Windows 机器都拥有像 DirectX Runtime 这样的大量副本的原因。
  • 我使用 Winsock,我不需要捆绑任何东西——它是操作系统的一部分。

标签: c++ windows visual-c++ winsock


【解决方案1】:

几乎可以肯定,缺少的是 C 和 C++ 语言运行时库(又名“CRT”),而不是 Winsock。你忽略了 CRT,因为你不需要做任何事情来链接它,链接器默认包含它(除非你传递 /NODEFAULTLIB)。

Visual Studio 确实允许您静态链接 CRT。在您的项目属性中,在 C/C++ -> 代码生成下,将“运行时库”更改为 /MT(多线程,非调试,非 DLL)。

【讨论】:

  • 对静态搜索的快速搜索表明它将库捆绑到可执行文件中。因此,如果您对所需的库是 CRT 是正确的,并且我像您描述的那样将它静态链接到我的可执行文件,我将能够分发它?
  • @StormClaw:该许可证允许您重新分发库的发布版本,包括通过将其链接到其中。并且不允许您重新分发库的调试版本。
猜你喜欢
  • 2017-05-12
  • 2014-01-26
  • 2023-03-27
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多