簡體   English   中英

無法交叉編譯帶有 Windows 的 OpenSSL 支持的 cURL

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

我正在嘗試從 Linux (Debian Jessie) 為 Windows 進行交叉編譯。 我已經編譯了zlibOpenSSL並且 cURL 的配置腳本確實找到了這些庫,但是它仍然說 SSL 支持已關閉。

這是我使用的構建腳本:

# 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

它成功找到了該庫,但由於缺少--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

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

為了使用 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

檢查這個curl 交叉編譯腳本

我也花了整整一周的時間才為 cURL 啟用 SSL。 從您的配置日志中,您需要將這兩行啟用為yes

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

問題在於 OpenSSL 的構建方式。 就我而言,我通過添加-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;

如果鏈接器undefined reference to 'TLS_DTPREL_VALUE'有錯誤,請參閱鏈接https://codeleading.com/article/82492718270/ ,鏈接上的修復程序可能不適用於您的 OpenSSL,您必須將其修改為適合您的 OpenSSL 版本。

使用我的 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

對於 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

構建腳本是從 Makefile 復制的,因此如果您的環境中有任何部分不可用,只需修改它以適合您的目標。

最后,在編譯 cURL 時,如果您遇到 OpenSSL 標頭存在但無法像下面示例代碼那樣編譯的問題。 也許您不需要修改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