【发布时间】:2019-03-17 07:22:18
【问题描述】:
如果我构建一个 cmake 文件,使用 make 创建一个可执行文件并删除除可执行文件之外的所有内容,该可执行文件仍然可以运行。我可以吗,
- 构建文件,但唯一的输出是可以使用 ./project 执行的文件
或
- 构建所有文件,使用 make 创建可执行文件,然后删除除可执行文件之外的所有内容
如果是这样,我该怎么做?
【问题讨论】:
如果我构建一个 cmake 文件,使用 make 创建一个可执行文件并删除除可执行文件之外的所有内容,该可执行文件仍然可以运行。我可以吗,
或
如果是这样,我该怎么做?
【问题讨论】:
如果我理解正确,您想创建一个即使 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
【讨论】:
你为什么需要那个?
您可以将install() 命令添加到您的CMakeLists.txt,然后调用make install 将您的可执行文件复制到CMAKE_INSTALL_PREFIX 目录中。如果您将CMAKE_INSTALL_PREFIX 设置为一个空目录,您将得到一个仅包含您的可执行文件的目录。
【讨论】: