代码中的MinGW::块不链接静态OpenSSL库

MinGW in Code::Blocks not linking static OpenSSL Library

本文关键字:链接 静态 OpenSSL MinGW 代码      更新时间:2023-10-16

我试图利用OpenSSL的一些EC加密和ECDSA功能来制作基本的区块链模拟,但我遇到了一个主要的障碍。我正在使用代码::Blocks IDE,并且我已经使用此处找到的64位二进制文件安装了OpenSSL:https://slproweb.com/products/Win32OpenSSL.html。

在链接器设置中,我添加了OpenSSL-Win64\lib\openssl.lib

在>编译器的搜索目录中,我添加了OpenSSL-Win64\include

在 Search Directory> Linker 中,我添加了 OpenSSL-Win64\lib

但是,当我编译时,我尝试使用的每个OpenSSL函数都会收到"未定义的引用(函数名称)"错误。但是,编译器似乎成功地包含头文件,因为它可以识别EC_KEY等新数据类型。我怀疑存在链接错误,但我不确定可能出了什么问题,因为我如上所述链接了链接路径和静态库。

这是我的构建日志:

mingw32-g++.exe -LD:OpenSSL-Win64lib -LD:OpenSSL-Win64include -LD:OpenSSL-Win64 -o binDebugBlockchainSim.exe objDebugmain.o     objDebugsrcBlock.o objDebugsrcBlockchainNode.o objDebugsrcTransaction.o     objDebugsrcValuable.o   D:OpenSSL-Win64libopenssl.lib
objDebugsrcBlockchainNode.o: In function `ZN14BlockchainNodeC2Ei':
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:18: undefined reference to `EC_KEY_new_by_curve_name'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:21: undefined reference to `BN_new'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:22: undefined reference to `EC_KEY_set_private_key'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:25: undefined reference to `BN_CTX_new'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:26: undefined reference to `BN_CTX_start'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:28: undefined reference to `EC_KEY_get0_group'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:29: undefined reference to `EC_POINT_new'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:30: undefined reference to `EC_POINT_mul'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:31: undefined reference to `EC_KEY_set_public_key'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:34: undefined reference to `EC_POINT_free'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:35: undefined reference to `BN_CTX_end'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:36: undefined reference to `BN_CTX_free'
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:37: undefined reference to `BN_clear_free'
objDebugsrcBlockchainNode.o: In function `ZN14BlockchainNodeD2Ev':
F:/School/Barrett/BlockchainSim/src/BlockchainNode.cpp:42: undefined reference to `EC_KEY_free'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
15 error(s), 0 warning(s) (0 minute(s), 0 second(s))

我希望我只是在这里错过了一些简单的东西,因为我是链接静态库的新手。许多类似的问题似乎可以通过添加编译命令的选项来解决,但由于我使用 Code::Blocks 并将 OpenSSL 链接为静态库,我不确定这些是否适用于这里。任何帮助将不胜感激。

想通了。问题是我没有 C:/MinGW 文件夹(因为 Code::Blocks 在其自己的目录中安装了 MinGW)。我猜我使用的二进制文件试图检测现有的编译器,并根据它找到的内容以不同的方式编译库。

我通过使用默认路径(C:/MinGW)安装默认的MinGW(使用MSY,如果重要的话)来修复它,然后重新安装原始问题中链接的32位二进制OpenSSL,也是在默认路径(C:/OpenSSL-Win32)中。这使得在 C:/OpenSSL-Win32/lib 文件夹中,有一个新的 MinGW 文件夹,然后我将其包含在链接器搜索目录中。