Alpine3.18安装curl-cffi>=0.5.9时-lstdc++找不到问题求助
解决Alpine 3.18安装curl-cffi>=0.5.9的链接错误
问题现象
在Alpine 3.18环境中安装Python依赖curl-cffi>=0.5.9时,出现编译链接错误,提示cannot find -lstdc++。本地M1芯片MacBook Pro上可正常构建Docker镜像,但云服务器上失败。已尝试安装libstdc++和libffi-dev,问题仍未解决。
错误日志
#12 59.10 gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC #12 59.10 -Ilibbrotli -Ilibbrotli/include -I/root/visa/.venv/include #12 59.10 -I/usr/local/include/python3.10 -c build/temp.linux-x86_64-cpython-310/_brotli.c #12 59.10 -o #12 59.10 build/temp.linux-x86_64-cpython-310/build/temp.linux-x86_64-cpython-310/_brotli.o #12 59.10 gcc -shared #12 59.10 build/temp.linux-x86_64-cpython-310/build/temp.linux-x86_64-cpython-310/_brotli.o -L/usr/local/lib -Lbuild/temp.linux-x86_64-cpython-310 -llibbrotli -lstdc++ #12 59.10 -llibbrotli -o build/lib.linux-x86_64-cpython-310/brotli/_brotli.abi3.so #12 59.10 /usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lstdc++: No such file or directory #12 59.10 collect2: error: ld returned 1 exit status #12 59.10 error: command '/usr/bin/gcc' failed with exit code 1 #12 59.10 add curl-cffi failed: #12 59.10 Traceback (most recent call last): #12 59.10 File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run #12 59.10 result = self.fn(*self.args, **self.kwargs) #12 59.10 File "/usr/local/lib/python3.10/site-packages/pdm/installers/synchronizers.py", line 286, in install_candidate #12 59.10 self.manager.install(can) #12 59.10 File "/usr/local/lib/python3.10/site-packages/pdm/installers/manager.py", line 33, in install #12 59.10 installer(str(prepared.build()), self.environment, prepared.direct_url()) #12 59.10 File "/usr/local/lib/python3.10/site-packages/pdm/models/candidates.py", line 414, in build #12 59.10 self.wheel = Path(builder.build(build_dir, metadata_directory=self._metadata_dir)) #12 59.10 File "/usr/local/lib/python3.10/site-packages/pdm/builders/wheel.py", line 28, in build #12 59.10 filename = self._hook.build_wheel(out_dir, config_settings, metadata_directory) #12 59.10 File "/usr/local/lib/python3.10/site-packages/pyproject_hooks/_impl.py", line 209, in build_wheel #12 59.10 return self._call_hook('build_wheel', { #12 59.10 File "/usr/local/lib/python3.10/site-packages/pyproject_hooks/_impl.py", line 311, in _call_hook #12 59.10 self._subprocess_runner( #12 59.10 File "/usr/local/lib/python3.10/site-packages/pdm/builders/base.py", line 261, in subprocess_runner #12 59.10 return log_subprocessor(cmd, cwd, extra_environ=env) #12 59.10 File "/usr/local/lib/python3.10/site-packages/pdm/builders/base.py", line 107, in log_subprocessor #12 59.10 raise build_error(e) from None #12 59.10 pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines #12 59.10 of the build output: #12 59.10 | curl_easy_perform #12 59.10 gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC #12 59.10 -Icurl_cffi/include -Icurl_cffi/ffi -I/root/visa/.venv/include #12 59.10 -I/usr/local/include/python3.10 -c curl_cffi/ffi/shim.c -o #12 59.10 build/temp.linux-x86_64-cpython-310/curl_cffi/ffi/shim.o #12 59.10 curl_cffi/ffi/shim.c: In function '_curl_easy_setopt': #12 59.10 curl_cffi/ffi/shim.c:9:16: warning: unused variable 'opt_value'
当前Dockerfile内容
FROM python:3.10-alpine3.18 MAINTAINER jiangxiaoqiang (jiangtingqiang@gmail.com) ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone \ && mkdir -p /root/visa \ && apk update \ && apk add gcc wget curl vim musl-dev libstdc++ curl-dev RUN pip install pdm ADD . /root/visa/ WORKDIR /root/visa/ RUN pdm install ENTRYPOINT exec /root/visa/scripts/startup-app.sh
解决方法
1. 安装g++编译包
Alpine中的libstdc++仅为运行时库,编译链接阶段需要g++包提供完整的C++标准库文件。修改Dockerfile中的apk安装命令,添加g++:
apk add gcc wget curl vim musl-dev libstdc++ curl-dev g++ libffi-dev
2. 优先使用预编译轮子(可选)
云服务器为x86_64架构,可指定安装curl-cffi的预编译轮子,跳过本地编译步骤,避免架构相关的编译问题。在执行pdm install前添加环境变量:
ENV PIP_ONLY_BINARY=curl-cffi
或者在项目的pyproject.toml中添加配置:
[tool.pdm.resolution] only-binary = ["curl-cffi"]
3. 适配跨架构差异
本地M1 Mac为arm64架构,云服务器为x86_64,架构差异可能导致编译依赖时出现问题。若需要跨平台构建,可使用Docker buildx工具指定目标平台:
docker buildx build --platform linux/amd64 -t your-image-name .
修正后的Dockerfile示例
FROM python:3.10-alpine3.18 MAINTAINER jiangxiaoqiang (jiangtingqiang@gmail.com) ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone \ && mkdir -p /root/visa \ && apk update \ && apk add gcc wget curl vim musl-dev libstdc++ curl-dev g++ libffi-dev RUN pip install pdm ADD . /root/visa/ WORKDIR /root/visa/ # 可选:启用预编译轮子 # ENV PIP_ONLY_BINARY=curl-cffi RUN pdm install ENTRYPOINT exec /root/visa/scripts/startup-app.sh
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

