简体   繁体   English

无法交叉编译带有 Windows 的 OpenSSL 支持的 cURL

[英]Cannot cross-compile cURL with OpenSSL support for Windows

I'm trying to cross-compile from Linux (Debian Jessie) for Windows.我正在尝试从 Linux (Debian Jessie) 为 Windows 进行交叉编译。 I've compiled zlib and OpenSSL and the configuring script of cURL did find the libraries however it still said that SSL support was switched off.我已经编译了zlibOpenSSL并且 cURL 的配置脚本确实找到了这些库,但是它仍然说 SSL 支持已关闭。

This is the build script I used:这是我使用的构建脚本:

# ZLIB
cd /builds
curl -O -J http://www.zlib.net/zlib-1.2.11.tar.gz
tar xf zlib-1.2.11.tar.gz
cd /builds/zlib-1.2.11
CC=x86_64-w64-mingw32-gcc ./configure --prefix=/usr/x86_64-w64-mingw32 --static
make && make install

# OPENSSL
cd /builds
curl -O -J https://www.openssl.org/source/openssl-1.1.0c.tar.gz
tar xf openssl-1.1.0c.tar.gz
cd /builds/openssl-1.1.0c
CROSS_COMPILE="x86_64-w64-mingw32-" ./Configure -DHAVE_STRUCT_TIMESPEC -lz -lws2_32 zlib mingw64 no-shared --prefix=/usr/x86_64-w64-mingw32
make depend
make && make install

# CURL
cd /builds
curl -O -J https://curl.haxx.se/download/curl-7.52.1.tar.gz
cd /builds/curl-7.52.1
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --enable-optimize --with-ssl=/usr/x86_64-w64-mingw32

It found the library successfully but then SSL just got disabled because of missing --with-ssl它成功找到了该库,但由于缺少--with-ssl SSL 刚刚被禁用

checking whether to enable Windows native SSL/TLS (Windows native builds only)... no
checking whether to enable Apple OS native SSL/TLS... no
checking for gdi32... yes
configure: PKG_CONFIG_LIBDIR will be set to "/usr/x86_64-w64-mingw32/lib/pkgconfig"
checking for x86_64-w64-mingw32-pkg-config... /usr/bin/pkg-config
checking for openssl options with pkg-config... found
configure: pkg-config: SSL_LIBS: "-lssl -lcrypto "
configure: pkg-config: SSL_LDFLAGS: "-L/usr/x86_64-w64-mingw32/lib "
configure: pkg-config: SSL_CPPFLAGS: "-I/usr/x86_64-w64-mingw32/include "
checking for HMAC_Update in -lcrypto... no
checking for HMAC_Init_ex in -lcrypto... no
checking for ssl_version in -laxtls... no
configure: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.
configure: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this.
checking default CA cert bundle/path... configure: WARNING: skipped the ca-cert path detection when cross-compiling
no
checking whether to use builtin CA store of SSL library... no

Full log: https://paste.kde.org/pwzewydif完整日志: https : //paste.kde.org/pwzewydif

To cross compile curl with ssl support, I provided the location directly in CPP_FLAGS and LD_FLAGS rather than providing the path with --with-ssl :为了使用 ssl 支持交叉编译 curl,我直接在CPP_FLAGSLD_FLAGS提供了位置,而不是使用--with-ssl提供路径:

export DESTDIR="$CURL_INSTALL_DIR"
export CPPFLAGS="-I${OPENSSL_INSTALL_DIR}/include -I${ZLIB_INSTALL_DIR}/include"
export LDFLAGS="-L${OPENSSL_INSTALL_DIR}/lib -L${ZLIB_INSTALL_DIR}/lib"
export LIBS="-lssl -lcrypto"

CURL_ARGS="--with-ssl --with-zlib --disable-ftp --disable-gopher 
    --disable-file --disable-imap --disable-ldap --disable-ldaps 
    --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp 
    --disable-telnet --disable-tftp --without-gnutls --without-libidn 
    --without-librtmp --disable-dict"

chmod 777 buildconf
./buildconf
./configure --host="${CROSS_COMPILE}" $CURL_ARGS

make -j16
make install

Check this curl cross compilation script检查这个curl 交叉编译脚本

I struggled a whole week to enable SSL for cURL also.我也花了整整一周的时间才为 cURL 启用 SSL。 From your configuration log, you need to enable these 2 lines to yes从您的配置日志中,您需要将这两行启用为yes

checking for HMAC_Update in -lcrypto... no
checking for HMAC_Init_ex in -lcrypto... no

The issue lies in how OpenSSL is built.问题在于 OpenSSL 的构建方式。 In my case, I built OpenSSL with adding -fPIC -ldl as below就我而言,我通过添加-fPIC -ldl构建了 OpenSSL,如下所示

#For OpenSSL 1.0.2s
export USING_OPENSSL=./openssl-1.0.2s
export CROSS_COMPILE_PREFIX=mips-unknown-linux-uclibc-
export SSL_OPTIONS="enable-ssl-trace enable-shared enable-ssl enable-ssl2 enable-ssl3 enable-ssl3-method enable-
tls enable-tls1_1 enable-tls1_2 enable-weak-ssl-ciphers enable-unit-test enable-async enable-md2"

cd $USING_OPENSSL && CC=gcc AR=ar RANLIB=ranlib LD=ld ./Configure linux-mips32 -fPIC -ldl --openssldir=$USING_OPENSSL/OPSSL --prefix=$USING_OP
ENSSL/OPSSL --cross-compile-prefix=$CROSS_COMPILE_PREFIX $SSL_OPTIONS

make -C $USING_OPENSSL;
make install -C $USING_OPENSSL;

If you have errors with the linker undefined reference to 'TLS_DTPREL_VALUE' then please refer to the link https://codeleading.com/article/82492718270/ , the fixes on the link may not work for your OpenSSL, you have to modify it to fit your OpenSSL version.如果链接器undefined reference to 'TLS_DTPREL_VALUE'有错误,请参阅链接https://codeleading.com/article/82492718270/ ,链接上的修复程序可能不适用于您的 OpenSSL,您必须将其修改为适合您的 OpenSSL 版本。

With my OpenSSL 1.0.2s, the build target is different so need to modify as below:使用我的 OpenSSL 1.0.2s,构建目标是不同的,所以需要修改如下:

@echo Patch Makefile
sed -i -e 's/build_all:.*/build_all: build_libs/g' $USING_OPENSSL/Makefile
sed -i -e 's/build_libs:.*/build_libs: build_libcrypto build_libssl build_engines openssl.pc/g' $USING_OPENSSL/Makefile
sed -i -e 's/DIRS=   crypto ssl engines.*/DIRS=  crypto ssl engines/g' $USING_OPENSSL/Makefile

For cURL v7.48.0, I had to run autoreconf before ./configure , due to some issues with recognizing the -ldl of the configuration.ac.对于 cURL v7.48.0,我不得不在./configure之前运行autoreconf ,因为在识别 configuration.ac 的-ldl时遇到了一些问题。

cd $APP_CURL_DIR && autoreconf && LIBS="-ldl -lpthread" ./configure --prefix=$APP_CURL_DIR/curl --target=$COMPILE_TOOLCHAIN --host=$HOST CC
=mips-unknown-linux-uclibc-gcc --with-ssl=$USING_OPENSSL/OPSSL --enable-static

The build script is copied from the Makefile, so if there is any part that isn't available in your environment, just modify it to fit your target.构建脚本是从 Makefile 复制的,因此如果您的环境中有任何部分不可用,只需修改它以适合您的目标。

Final word, while compiling cURL, if you encounter the issue that OpenSSL headers is present but can not be compiled like the example code below .最后,在编译 cURL 时,如果您遇到 OpenSSL 标头存在但无法像下面示例代码那样编译的问题。 Maybe you don't need to modify the configure.ac , please try autoconf or autoreconf first, then run ./configure with -ldl option like I posted above.也许您不需要修改configure.ac ,请先尝试autoconfautoreconf ,然后像我上面发布的那样使用-ldl选项运行 ./configure 。

configure: WARNING: pi.h: present but cannot be compiled
     configure: WARNING: pi.h:     check for missing prerequisite headers?
     configure: WARNING: pi.h: see the Autoconf documentation
     configure: WARNING: pi.h:     section "Present But Cannot Be Compiled"
     configure: WARNING: pi.h: proceeding with the compiler's result
     configure: WARNING:     ## -------------------------------------- ##
     configure: WARNING:     ## Report this to bug-example@example.org ##
     configure: WARNING:     ## -------------------------------------- ##

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM