在OS X系统下使用Mingw无法正确链接OpenSSL库
咱们先拆解你遇到的核心问题:你用x86_64-w64-mingw32-g++交叉编译Windows目标程序,但链接的是本地macOS的OpenSSL库(/usr/local/opt/openssl/是Homebrew在macOS上的默认路径)——跨平台的库文件不兼容,这就导致链接器找不到针对Windows平台的BIO函数实现,自然报出undefined reference错误。
下面给你几个可行的解决步骤:
1. 安装针对mingw的交叉编译版OpenSSL
首先得替换掉本地的macOS版OpenSSL,安装适配x86_64-w64-mingw32的交叉编译版本。在macOS上可以通过Homebrew直接安装:
brew install mingw-w64-openssl
安装完成后,它的默认路径是/usr/local/opt/mingw-w64-openssl/,里面包含完全适配Windows目标的头文件和库文件。
2. 调整编译脚本的路径与链接顺序
把原来的build.sh里的路径替换成交叉编译版OpenSSL的路径,同时注意库的链接顺序(依赖库要放在被依赖代码的后面,-lssl依赖-lcrypto,所以要把-lssl放在-lcrypto前面):
x86_64-w64-mingw32-g++ rsa.cpp -L/usr/local/opt/mingw-w64-openssl/lib -lssl -lcrypto -I/usr/local/opt/mingw-w64-openssl/include -static-libstdc++ -static-libgcc -o main.exe
3. 验证库的兼容性(可选)
如果还是报错,可以先确认一下你链接的库是不是真的适配Windows目标:
file /usr/local/opt/mingw-w64-openssl/lib/libcrypto.a
正常输出应该包含x86_64-w64-mingw32相关标识,说明这是适配交叉编译目标的库文件。
额外提示:完全静态编译(可选)
如果你想把OpenSSL库也打包进exe,实现完全静态编译,可以加上-static参数(前提是交叉编译版OpenSSL是静态编译的版本):
x86_64-w64-mingw32-g++ rsa.cpp -L/usr/local/opt/mingw-w64-openssl/lib -lssl -lcrypto -I/usr/local/opt/mingw-w64-openssl/include -static-libstdc++ -static-libgcc -static -o main.exe
补充说明:你报错里的
BIO_new_mem_buf和BIO_f_base64都是OpenSSL crypto库的核心函数,只要正确链接针对Windows平台的libcrypto库,就能解决这些未定义引用问题。
内容的提问来源于stack exchange,提问作者Gintas_

