【问题标题】:MinGW in Code::Blocks not linking static OpenSSL Library代码中的 MinGW::Blocks 未链接静态 OpenSSL 库
【发布时间】:2017-08-22 07:11:02
【问题描述】:

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

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

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

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

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

这是我的构建日志:

mingw32-g++.exe -LD:\OpenSSL-Win64\lib -LD:\OpenSSL-Win64\include -LD:\OpenSSL-Win64 -o bin\Debug\BlockchainSim.exe obj\Debug\main.o     obj\Debug\src\Block.o obj\Debug\src\BlockchainNode.o obj\Debug\src\Transaction.o     obj\Debug\src\Valuable.o   D:\OpenSSL-Win64\lib\openssl.lib
obj\Debug\src\BlockchainNode.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'
obj\Debug\src\BlockchainNode.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 作为静态库链接,我不确定这些是否适用于此。非常感谢任何帮助。

【问题讨论】:

  • 您是否也使用相同的编译器和标志编译了 openssl.lib 等?
  • 否,但由于我使用的二进制文件的性质,这不是必需的。它基本上为您安装和编译 OpenSSL。

标签: c++ openssl codeblocks


【解决方案1】:

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

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

【讨论】:

  • 我遇到了同样的问题,你能添加完整的有效命令吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多