alpine clang 下缺少 C++ 标头

alpine clang 下缺少 C++ 标头

我正在尝试构建一个基于 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

相关内容