我正在尝试构建一个基于 alpine 的小型 docker 容器,以使用 clang++ 构建 c++ 应用程序。Dockerfile
看起来像这样:
FROM alpine:3.10
RUN apk add --no-cache clang
但是当我尝试编译 hello world 时,出现以下错误:
$ printf '#include <iostream>\nint main(){std::cout<<"Hello"<<std::endl;}' > test.cxx
$ clang++ test.cxx -o test
test.cxx:1:10: fatal error: 'iostream' file not found
#include <iostream>
^~~~~~~~~~
1 error generated.
但是,如果我将包添加g++
到此容器,则此示例将按预期进行编译和工作。
该包似乎g++
包含所有 C++ 标头:
apk info --who-owns /usr/include/c++/9.2.0/iostream
/usr/include/c++/9.2.0/iostream is owned by g++-9.2.0-r3
有没有办法在不安装g++的情况下安装c++头文件?我想让我的 docker 镜像保持较小,而 g++ 及其依赖项相当重。
答案1
不幸的是,g++ 是唯一提供iostream
标准 C++ 头文件的包。您可以通过按内容搜索 Alpine Linux 软件包索引来确认这一点:
https://pkgs.alpinelinux.org/contents?file=iostream&path=&name=&branch=v3.10&arch=x86_64
但是,为了保持映像较小,您可以安装该g++
软件包并从最终映像中删除所有 g++ 可执行文件,方法是使用两阶段 docker 构建或在构建后对映像进行 sqashing,如下所述:Alpine 的轻量级 GCC。
本质上,您应该将所有内容都放在/usr/include/c++
和下/usr/lib
。您可以删除gcc 可执行二进制文件下/usr/bin
,以及cc1plus
下/usr/libexec/gcc
。