MinGW编译Qt项目时出现OpenSSL函数未定义引用错误求助
问题
在Qt 5.15.2 + MinGW 7.3.0 + OpenSSL 1.1.1环境下构建项目时,编译出现大量OpenSSL函数未定义引用错误,错误信息如下:
undefined reference to `EC_KEY_free' undefined reference to `EC_POINT_free' undefined reference to `EC_KEY_free' undefined reference to `EC_KEY_free' undefined reference to `EC_POINT_free' undefined reference to `BIO_s_mem' undefined reference to `BIO_new' undefined reference to `EC_GROUP_new_by_curve_name' undefined reference to `PEM_write_bio_ECPrivateKey' undefined reference to `PEM_write_bio_ECPKParameters' undefined reference to `PEM_write_bio_EC_PUBKEY' undefined reference to `BIO_read' undefined reference to `BIO_free_all' undefined reference to `EC_GROUP_free' undefined reference to `EC_KEY_free' undefined reference to `EC_KEY_new' undefined reference to `EC_GROUP_new_by_curve_name' undefined reference to `EC_KEY_set_group'
项目的.pro文件内容:
QT += core gui QT += network widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets win32:CONFIG(release, debug|release): LIBS += -L"C:/OpenSSL-Win32/lib/MinGW/libssl.a" win32:CONFIG(release, debug|release): LIBS += -L"C:/OpenSSL-Win32/lib/MinGW/libcrypto.a" win32: LIBS += -lgdi32 -lws2_32 -ladvapi32 -lcrypt32 -luser32 win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../dependencies/decentralised_p2p/src/release/ -ldecentralised_p2p else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../dependencies/decentralised_p2p/build-decentralised_p2p-Desktop_Qt_5_8_0_MSVC2013_64bit2-Debug/debug/ -ldecentralised_p2p else:macx: LIBS += -L$$PWD/../dependencies/decentralised_p2p/build-decentralised_p2p-Desktop_Qt_5_8_0_clang_64bit-Debug -ldecentralised_p2p else:unix: LIBS += -L$$PWD/../dependencies/decentralised_p2p/build-decentralised_p2p-Desktop-Debug/ -ldecentralised_p2p win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../dependencies/decentralised_data/src/release/ -ldecentralised_data else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../dependencies/decentralised_data/build-decentralised_data-Desktop_Qt_5_8_0_MSVC2013_64bit2-Debug/debug/ -ldecentralised_data else:unix: LIBS += -L$$PWD/../dependencies/decentralised_data/build-decentralised_data-build-decentralised_p2p-Desktop-Debug-Debug/ -ldecentralised_data win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../dependencies/decentralised_crypt/src/release/ -ldecentralised_crypt else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../dependencies/decentralised_crypt/build-decentralised_crypt-Desktop_Qt_5_8_0_MSVC2013_64bit2-Debug/debug/ -ldecentralised_crypt else:unix: LIBS += -L$$PWD/../dependencies/decentralised_crypt/build-decentralised_crypt-build-decentralised_p2p-Desktop-Debug-Debug/ -ldecentralised_crypt INCLUDEPATH += $$PWD/../dependencies/decentralised_p2p/src DEPENDPATH += $$PWD/../dependencies/decentralised_p2p/src/release INCLUDEPATH += $$PWD/../dependencies/decentralised_data/src DEPENDPATH += $$PWD/../dependencies/decentralised_data/src/release INCLUDEPATH += $$PWD/../dependencies/decentralised_crypt/src DEPENDPATH += $$PWD/../dependencies/decentralised_crypt/src/release win32: DEFINES += WINDOWS macx: DEFINES += MACOSX win32:INCLUDEPATH += "C:/OpenSSL-Win32/include/" TARGET = decentralised_ui TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS CONFIG += static # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp\ mainwindow.cpp \ logindialog.cpp \ aboutdialog.cpp \ preferencesdialog.cpp \ settings.cpp \ newuserdialog.cpp HEADERS += mainwindow.h \ logindialog.h \ aboutdialog.h \ preferencesdialog.h \ settings.h \ newuserdialog.h FORMS += mainwindow.ui \ logindialog.ui \ aboutdialog.ui \ preferencesdialog.ui \ newuserdialog.ui RC_FILE = dc.rc DISTFILES += \ dc.rc RESOURCES += \ resources.qrc TRANSLATIONS = decentralised_pt.ts \ decentralised_ru.ts \ decentralised_de.ts
解决方案
1. 修正OpenSSL库链接语法错误
.pro文件中OpenSSL的链接写法有误:-L参数用于指定库文件所在路径,而非直接指定库文件。正确写法是先指定路径,再通过-l参数指定库名(libssl.a对应-lssl,libcrypto.a对应-lcrypto)。
将原代码中的:
win32:CONFIG(release, debug|release): LIBS += -L"C:/OpenSSL-Win32/lib/MinGW/libssl.a" win32:CONFIG(release, debug|release): LIBS += -L"C:/OpenSSL-Win32/lib/MinGW/libcrypto.a"
替换为:
win32: LIBS += -L"C:/OpenSSL-Win32/lib/MinGW" -lssl -lcrypto
2. 确保Debug模式也链接OpenSSL库
原配置仅在Release模式下添加了OpenSSL库链接,Debug模式未配置,导致Debug编译时找不到函数实现。上述修改后,win32: LIBS会同时作用于Debug和Release模式,解决此问题。
3. 验证库与编译器的位数匹配
确认你使用的OpenSSL库(C:/OpenSSL-Win32是32位版本)与MinGW编译器位数一致:若MinGW是64位,需替换为64位OpenSSL库,否则会因位数不匹配导致链接错误。
4. 检查依赖库的链接顺序
OpenSSL的libssl依赖libcrypto,链接时需将-lssl放在-lcrypto之前(链接器按从左到右顺序解析依赖),上述修改已遵循此顺序。
完成修改后,重新执行qmake并编译项目,即可解决未定义引用错误。
内容的提问来源于stack exchange,提问作者Ed Vestorn
相关产品推荐
相关产品推荐

