Ubuntu 22.04下编译Qt 5.5.1失败,OpenSSL依赖问题求助
在Ubuntu 22.04编译Qt 5.5.1时的OpenSSL依赖问题
操作步骤
- 下载Qt 5.5.1源码
- 下载OpenSSL 1.0.2n并解压至
/opt/openssl1.0.2 - 执行配置命令:
OPENSSL_LIBS='-L/opt/openssl1.0.2/lib -lssl -lcrypto' ~/src/Qt/5.5.1/configure -prefix /opt/Qt-build/5.5.1 -confirm-license -opensource -system-sqlite -nomake examples -nomake tests -openssl-linked -I /opt/openssl1.0.2/include/openssl -L /opt/openssl1.0.2/lib - 执行
make命令编译
问题表现
Qt编译时仍调用系统默认的OpenSSL库(而非指定的1.0.2版本),编译报错如下:
/usr/include/openssl/types.h:157:16: note: forward declaration of ‘X509’ {aka ‘struct x509_st’} 157 | typedef struct x509_st X509; | ^~~~~~~ /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_openssl.cpp: In member function ‘bool QSslKeyPrivate::fromEVP_PKEY(EVP_PKEY*)’: /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_openssl.cpp:81:13: error: invalid use of incomplete type ‘EVP_PKEY’ {aka ‘struct evp_pkey_st’} 81 | if (pkey->type == EVP_PKEY_RSA) { | ^~ In file included from /usr/include/openssl/crypto.h:36, from /usr/include/openssl/comp.h:22, from /usr/include/openssl/ssl.h:28, from /home/dev/src/Qt/5.5.1/qtbase/include/QtNetwork/5.5.1/QtNetwork/private/../../../../../src/network/ssl/qsslcontext_openssl_p.h:53, from /home/dev/src/Qt/5.5.1/qtbase/include/QtNetwork/5.5.1/QtNetwork/private/qsslcontext_openssl_p.h:1, from /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslsocket_p.h:55, from /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_p.h:51, from /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_openssl.cpp:36: /usr/include/openssl/types.h:107:16: note: forward declaration of ‘EVP_PKEY’ {aka ‘struct evp_pkey_st’} 107 | typedef struct evp_pkey_st EVP_PKEY; | ^~~~~~~~~~~ /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_openssl.cpp:87:48: error: invalid application of ‘sizeof’ to incomplete type ‘RSA’ {aka ‘rsa_st’} 87 | memcpy(rsa, q_EVP_PKEY_get1_RSA(pkey), sizeof(RSA)); | ^~~~~~~~~~~ /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_openssl.cpp:91:18: error: invalid use of incomplete type ‘EVP_PKEY’ {aka ‘struct evp_pkey_st’} 91 | else if (pkey->type == EVP_PKEY_DSA) { | ^~ In file included from /usr/include/openssl/crypto.h:36, from /usr/include/openssl/comp.h:22, from /usr/include/openssl/ssl.h:28, from /home/dev/src/Qt/5.5.1/qtbase/include/QtNetwork/5.5.1/QtNetwork/private/../../../../../src/network/ssl/qsslcontext_openssl_p.h:53, from /home/dev/src/Qt/5.5.1/qtbase/include/QtNetwork/5.5.1/QtNetwork/private/qsslcontext_openssl_p.h:1, from /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslsocket_p.h:55, from /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_p.h:51, from /home/dev/src/Qt/5.5.1/qtbase/src/network/ssl/qsslkey_openssl.cpp:36: /usr/include/openssl/types.h:107:16: note: forward declaration of ‘EVP_PKEY’ {aka ‘struct evp_pkey_st’} 107 | typedef struct evp_pkey_st EVP_PKEY;
解决方法
1. 编译安装OpenSSL 1.0.2
只解压包无法生成完整的头文件和库结构,必须编译安装:
cd /opt/openssl1.0.2 ./config --prefix=/opt/openssl1.0.2 --openssldir=/opt/openssl1.0.2 shared zlib make -j$(nproc) sudo make install
编译完成后,/opt/openssl1.0.2/include会有完整头文件,lib下有编译好的动态库。
2. 修改Qt配置命令,强制指定OpenSSL路径
通过环境变量让编译器优先使用指定的OpenSSL,避免系统路径干扰:
export CFLAGS="-I/opt/openssl1.0.2/include" export CXXFLAGS="-I/opt/openssl1.0.2/include" export LDFLAGS="-L/opt/openssl1.0.2/lib -Wl,-rpath=/opt/openssl1.0.2/lib" export OPENSSL_LIBS="-lssl -lcrypto" ~/src/Qt/5.5.1/configure -prefix /opt/Qt-build/5.5.1 -confirm-license -opensource -system-sqlite -nomake examples -nomake tests -openssl-linked
CFLAGS/CXXFLAGS强制编译器优先查找指定路径的头文件LDFLAGS中的-Wl,-rpath确保编译后的Qt程序运行时能找到指定的OpenSSL库
3. 清理编译缓存
如果之前执行过configure或make,必须先清理缓存:
cd ~/src/Qt/5.5.1 make distclean
之后重新执行上述配置和编译命令。
4. 验证配置生效
配置完成后,查看输出日志,确认Qt检测到的OpenSSL版本为1.0.2:
OpenSSL support ....................... yes (linked to system library)
若版本不对,检查环境变量设置或OpenSSL编译是否成功。
内容的提问来源于stack exchange,提问作者luffy
相关产品推荐
相关产品推荐

