【问题标题】:What's the best way to "package" a c application?“打包” c 应用程序的最佳方式是什么?
【发布时间】:2015-07-17 05:11:24
【问题描述】:

每次我让一个 c 应用程序无人看管一段时间,升级我的发行版或更改一些包,构建会立即中断。

我需要的是一个构建系统,它以 .zip 格式下载具有特定版本的特定库,并将其作为构建过程的一部分安装在机器上。更好的是本地安装到 /lib 文件夹中。 但是我也有一些依赖项,例如库可能需要 libjpeg-dev 来获得完整的功能集。

我知道的构建系统(make、tup、cmake)不处理拉依赖。我想要类似 maven for c 的东西,有吗?

【问题讨论】:

    标签: c build makefile


    【解决方案1】:

    您可以使用 -M 和相关的 preprocessor 标志到 gcc 让您的 Makefile 自动生成依赖项;因此,如果外部包含的文件已更改,您的构建将完成。

    您可能对autoconf 感兴趣。它会检测到一些依赖项,但不会拉取它们。 pkg-config 也可以提供帮助。

    关于拉取依赖项,这是特定于操作系统的并且与package manager 相关。所以它在 Debian 或 Ubuntu(使用 aptitude 和 .deb 包)和 Fedora(使用 yum 和 .rpm 包)上是不同的

    看起来您想要一个通用包管理器,但没有。 每个 Linux 发行版都有自己的包管理(我听说 Window 或 MacOSX 有几个或没有,这取决于你如何计算它们)。

    顺便说一句,包的管理是系统管理员的工作。他当然不希望这是全自动的(因为包管理器可以检测到他的计算机特有的一些冲突)。

    最后,你通常不应该想要一个特定版本的库;你只关心API。您通常需要至少某个给定版本(或更高版本),因为它定义了您关心的 API:如果您的程序使用 GTK 3.14,那么它很可能是可构建的并且可以使用 GTK 3.16 运行(因为它们的 API 是兼容的)。

    您可以切换到更现代的语言,更好地支持modules(C 甚至 C++ 都不知道它们;它们可能会出现在 C++ 的某些未来版本中,可能是 C++17)。例如,Ocaml 拥有真正的一流模块和函子,还拥有 Opam(Ocaml 特定的)包管理器。

    【讨论】:

    • 我不明白,gcc 预处理器标志如何从 Internet 下载 graphicsmagick 并使用特定的 --options 集进行编译和安装?
    • 不会的。但如果你确实拉了它们,这将有助于 make 重新编译 相关 代码。
    【解决方案2】:

    似乎 bazel 可以同时做到:既是构建系统又是依赖管理器

    http://bazel.io/docs/external.html

    【讨论】:

      猜你喜欢
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2023-03-29
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多