我正在尝试使用OpenSSL在Linux上静态编译Python 3.6。
我的构建发生在一个dockerfile中,但本质上是:
$ ./configure --prefix=/task/build --disable-shared LDFLAGS="-static"
$ make altinstall
对Modules/Setup.local
进行更新,使其看起来像:
*static*
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
然而,在configure步骤中,我得到了错误:
Step 9/14 : RUN ./configure --prefix=/task/build --disable-shared LDFLAGS="-static"
---> Running in cb79ee47052b
checking for git... found
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for python3.6... no
checking for python3... no
checking for python... python
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... linux
checking for --without-gcc... no
checking for --with-icc... no
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/task/cpython':
configure: error: C compiler cannot create executables
See `config.log' for more details
The command '/bin/sh -c ./configure --prefix=/task/build --disable-shared LDFLAGS="-static"' returned a non-zero code: 77
如果我将configure命令更改为:
$ ./configure --prefix=/task/build --disable-shared
我得到一个编译的二进制文件,但它没有静态链接到OpenSSL。
我做错了什么?
谢谢你,谢谢
构建dockerfile:
FROM amazonlinux:2017.03.1.20170812
ARG python_version=3.6.8
WORKDIR /task
COPY Modules-Setup.local /task/Modules-Setup.local
# Install requirements
RUN yum install -y \
gcc \
git \
gzip \
openssl-devel \
tar \
zlib \
zlib-devel
# Get openssl and python source
RUN git clone https://github.com/python/cpython.git
WORKDIR /task/cpython
RUN git checkout tags/v${python_version}
# Configure the build
RUN ./configure --prefix=/task/build --disable-shared LDFLAGS="-static"
# Append modules setup with custom values
RUN cat /task/Modules-Setup.local >> /task/cpython/Modules/Setup.local
RUN cat /task/cpython/Modules/Setup.local
# Build
RUN make altinstall
# Zip the results
WORKDIR /task/build
RUN tar --create --gzip --file=/task/python-${python_version}.tar.gz \
lib/ bin/
3条答案
按热度按时间knsnq2tg1#
我正在尝试使用OpenSSL在Linux上静态编译Python 3.6。
...
将
-lssl
和-lcrypto
更改为-l:libssl.a
和-l:libcrypto.a
:您也可以使用存档的完整路径:
归档文件(
*.a
)只是目标文件(*.o
)的集合,因此您可以在使用目标文件的任何地方使用归档文件。另请参阅
-l:filename
在ld(2)
man page:--library=namespec
*将namespec指定的存档或目标文件添加到要链接的文件列表中。此选项可以使用任意次数。如果namespec的格式为:filename,ld将在库路径中搜索名为filename的文件,否则将在库路径中搜索名为libnamespec. a的文件。
如果您正在使用
/usr/local
中的其他组件,则可能需要将-L/usr/local/lib -Wl,-R,/usr/local/lib -Wl,--enable-new-dtags
添加到LDFLAGS
。new-dtags
将RUNPATH
(与RPATH
相对)嵌入到ELF头中。RUNPATH
可以被LD_LIBRARY_PATH
覆盖。我得到一个编译的二进制文件,但它没有静态链接到OpenSSL。
检查的方法是使用
ldd
和您在运行时使用的路径。例如,下面是Fedora上本地OpenSSL的构建:这里有几个相关的问题,但看起来它们并没有涵盖Python的静态链接。
需要明确的是,
config.log
有错误,但您没有显示其中的相关部分:静态OpenSSL可能(也可能不会)解决这个问题。
szqfcxe22#
我遇到了同样的问题,并通过安装静态glibc库解决了它:
relj7zay3#
你可以看看python仓库,里面有一个python编译python所需的模块列表和c文件名:
https://github.com/python/cpython/blob/51863b7d6ea183167da09fc6b3f2745a1aaa4ef5/Modules/Setup#LL232
大概是这样的:
做一个取消注解,并把它放入'Setup.local'文件,然后你就可以开始了。
如果你真的不知道如何编译它,我有一个dockerfile给你: