【问题标题】:How do I make cmake only build the executable for docker?如何让 cmake 只为 docker 构建可执行文件?
【发布时间】:2019-03-17 07:22:18
【问题描述】:

如果我构建一个 cmake 文件,使用 make 创建一个可执行文件并删除除可执行文件之外的所有内容,该可执行文件仍然可以运行。我可以吗,

  1. 构建文件,但唯一的输出是可以使用 ./project 执行的文件

  1. 构建所有文件,使用 make 创建可执行文件,然后删除除可执行文件之外的所有内容

如果是这样,我该怎么做?

【问题讨论】:

    标签: docker cmake


    【解决方案1】:

    如果我理解正确,您想创建一个即使 docker 映像没有任何依赖项也无法执行的独立二进制文件,那么您需要在构建期间使用静态选项 - 我不是这方面的专家 - 可能如Compiling a static executable with CMake 的以下答案所述。

    接下来,您可能会在 docker 中使用multi-stage builds,这将使您能够在没有任何构建依赖项的情况下仅使用可执行文件获得最终的最小映像,而只是运行时环境所需的包。我有一个不是make 的示例,它是使用g++ 创建的,但实现了如下类似的概念:

    FROM gcc:5 as builder
    COPY ./hello_world_example.cc /hello_world_example.cc
    RUN g++ -o hello_world_binary -static hello_world_example.cc && chmod +x hello_world_binary
    
    FROM debian:jessie
    COPY --from=builder /hello_world_binary /hello_world_binary
    CMD ["/hello_world_binary"]
    

    以及运行容器时的最终结果:

    $ docker run --rm -it helloworldimage:latest
    Hello from Dockerized image 
    

    【讨论】:

    • 如果应用程序比 hello world 更复杂,由于缺少系统二进制文件,使用临时图像可能会成为问题。最好使用一些系统映像,如 ubuntu 或 debian
    • @Miq,谢谢!我已经更新了答案,还有关于 cmake 部分的其他建议吗?
    • 不,我也会使用多阶段构建。至于 cmake,我不是专家,但我记得用它构建包并不难。
    【解决方案2】:

    你为什么需要那个?

    您可以将install() 命令添加到您的CMakeLists.txt,然后调用make install 将您的可执行文件复制到CMAKE_INSTALL_PREFIX 目录中。如果您将CMAKE_INSTALL_PREFIX 设置为一个空目录,您将得到一个仅包含您的可执行文件的目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2017-11-12
      • 2016-05-15
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多