【问题标题】:How to package C++ with dlls and libraries如何用 dll 和库打包 C++
【发布时间】:2012-06-12 17:01:35
【问题描述】:

我想知道如何“打包”一个 C++ 项目以进行发布。它使用各种库,我不希望用户必须进行与我相同的设置,将正确的文件放在正确的位置等等。我很难研究这个,因为我不确定这个问题的技术术语。如果我在 Linux 上使用命令行编译,有没有简单的方法可以做到这一点?

【问题讨论】:

  • 你是在linux上编译dll吗?
  • 对不起,我很愚蠢,我现在正在 Linux 和 Windows 上进行开发,我必须在这两个平台上为我的库进行大量设置;我是新手,可能会把两者混为一谈。我必须链接库,这是我在 Windows 上使用 dll 完成的(至少我认为那是那里发生的事情)。我正在编辑问题只是说库,因为我不知道事物之间的正确技术区别。
  • 库有两个版本:静态和动态。静态库直接链接到可执行文件,因此您无需担心将它们放在任何地方(代码是可执行文件的一部分)。对于动态库,您需要确保运行时可以找到它们:您需要将它们放在公共路径中,或者设置库的搜索路径以包含它们所在的目录。阅读这些two@ 987654322@了解更多信息。

标签: c++ release


【解决方案1】:

您是指安装人员?
在 Windows 上,您运行程序来安装一个新应用程序,该程序会在正确目录中删除所有内容,创建开始菜单并允许您卸载它?

Visual Studio 中有一个安装程序生成器(可能不在免费快递版本中),它可以生成 .msi 安装程序文件。对于简单的任务来说使用起来相当容易,但做更多的事情就变得复杂了。

或者,要创建传统的 setup.exe 类型安装,我使用出色的免费 Innosetup

在 linux 上,您通常会使用您的发行版使用的任何格式(.deb / .rpm)创建一个包。有很多关于每个细节的说明,并且执行此操作的工具可能已经安装在您的 Linux 系统中

【讨论】:

    【解决方案2】:

    您的处理方法在 Windows 和 Linux 上会有所不同,因为每个操作系统都以不同的方式处理此问题。我对 Linux 比较熟悉,所以我的回答仅限于 Linux 方面。

    当您使用 -l 标志将可执行文件与库链接时,链接器默认查找正常的系统库目录,因此这里有四种方法。

    1. 要求用户自行正确安装库。但是,听起来您不想这样做。

    2. 让用户将库位置添加到 LD_LIBRARY_PATH 变量中。

    3. 您的第三个选项是强制链接器使用 -rpath 标志在特定路径中查找库。例如,要让应用程序在其工作目录中查找可以编译的共享库:g++ -rpath ./ -l SomeLib -o MyApp myapp.cpp

    4. 另一种选择是将您的代码与其库静态链接,这样您只需分发一个可执行文件。如果存在静态库,您可以使用g++ -static -l SomeLib -o MyApp myapp.cpp 告诉 gcc 静态链接。

    【讨论】:

    • 为什么不静态链接它们?
    • @vidit 我想包括静态链接是个好主意。我编辑我的帖子。谢谢你提醒我。
    • 静态链接并不总是有效,例如当您使用 GPL 库但不想在 GPL 下许可您的程序时。
    【解决方案3】:

    在 Windows 上,我建议使用 wix http://wix.sourceforge.net/ 创建 .msi 安装程序 我想指出,.dll 的查找路径我建议将所有 .dll 放在与 .exe 相同的文件夹中,因为它具有最高优先级

    但是,vc crt(c/c++ 运行时库)应该使用微软的再分发包安装 -> 自动更新http://www.microsoft.com/de-de/download/details.aspx?id=5555

    Wix 可以将再分发包包含在同一个 .msi 中,因此您只需部署一个安装程序文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多