如何使cmake仅为docker构建可执行文件?

如何使cmake仅为docker构建可执行文件?,docker,cmake,Docker,Cmake,如果我构建一个cmake文件,创建一个带有make的executeble,并删除除可执行文件之外的所有内容,那么可执行文件仍然可以正常工作。我能 生成文件,但唯一的输出是可以使用./project执行的文件 或 构建所有文件,使用make创建可执行文件,然后删除除可执行文件之外的所有内容 如果是这样,我该怎么办?你为什么需要它 您可以将install()命令添加到CMakeLists.txt中,然后调用makeinstall将可执行文件复制到CMAKE\u install\u PREFIX目录中

如果我构建一个cmake文件,创建一个带有make的executeble,并删除除可执行文件之外的所有内容,那么可执行文件仍然可以正常工作。我能

  • 生成文件,但唯一的输出是可以使用./project执行的文件
  • 构建所有文件,使用make创建可执行文件,然后删除除可执行文件之外的所有内容
  • 如果是这样,我该怎么办?

    你为什么需要它

    您可以将
    install()
    命令添加到
    CMakeLists.txt
    中,然后调用
    makeinstall
    将可执行文件复制到
    CMAKE\u install\u PREFIX
    目录中。如果将
    CMAKE\u INSTALL\u PREFIX
    设置为空目录,则会以仅包含可执行文件的目录结尾。

    为什么需要该目录


    您可以将
    install()
    命令添加到
    CMakeLists.txt
    中,然后调用
    makeinstall
    将可执行文件复制到
    CMAKE\u install\u PREFIX
    目录中。如果您将
    CMAKE\u INSTALL\u PREFIX
    设置为空目录,则将以仅包含可执行文件的目录结束。

    如果我正确获取此信息,如果您想创建一个即使docker映像没有任何依赖项也无法执行的独立二进制文件,那么您需要在构建过程中使用static选项-我不是这方面的专家-可能如的以下回答中所述

    接下来,您可能会使用一个in-docker,它将使您能够在没有任何构建依赖项的情况下,只使用可执行文件的最终最小映像,而只使用运行时环境所需的包。我有一个例子不是用
    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 
    

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

    接下来,您可能会使用一个in-docker,它将使您能够在没有任何构建依赖项的情况下,只使用可执行文件的最终最小映像,而只使用运行时环境所需的包。我有一个例子不是用
    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更复杂,那个么由于缺少系统二进制文件,使用scratch映像可能是一个问题。最好使用一些系统映像,如ubuntu或debian@Miq谢谢我已经更新了答案,关于cmake部分还有其他建议吗?没有,我也会使用多级构建。至于cmake,我不是专家,但我记得用它构建软件包并不难。如果应用程序比hello world更复杂,使用scratch映像可能会因为缺少系统二进制文件而成为一个问题。最好使用一些系统映像,如ubuntu或debian@Miq谢谢我已经更新了答案,关于cmake部分还有其他建议吗?没有,我也会使用多级构建。至于cmake,我不是专家,但我记得用它构建软件包并不难。