macOS下g++编译调用OpenSSL的C++程序时出现链接错误
macOS下OpenSSL链接错误修复方案
错误根因
你遇到的链接报错全部来自编译参数写法错误,和OpenSSL安装本身无关:
- 你写的
-Wl,/usr/local/opt/openssl@3/lib/参数非法:-Wl,用于向链接器传递专用参数,直接传入目录路径会让链接器把目录当成可链接的二进制文件尝试映射,直接触发can't map file, errno=22错误。 - 库链接参数写法错误:你之前尝试添加的
-libssl -libcrypto不符合clang/gcc的参数规则,-l(小写L)参数会自动为传入的名称添加lib前缀和库文件后缀,正确写法是-lssl -lcrypto,错误写法会让链接器查找不存在的liblibssl文件,触发library not found报错。
另外你观察到的系统SDK目录下仅存在libboringssl是正常现象:从macOS Big Sur开始,系统不再内置可供开发者链接的OpenSSL库,自带的boringssl为系统服务专用,不对外提供头文件,必须使用brew安装的OpenSSL版本。
可直接运行的修复后编译命令
g++ -I/usr/local/opt/openssl@3/include -L/usr/local/opt/openssl@3/lib -arch x86_64 test.cpp -lssl -lcrypto -o test
参数说明:
-I/usr/local/opt/openssl@3/include:指定OpenSSL头文件搜索路径,你之前的写法正确-L/usr/local/opt/openssl@3/lib:大写L开头,指定链接器的库文件搜索目录,替换你之前写错的-Wl,传目录参数-lssl -lcrypto:小写L开头,指定需要链接的两个OpenSSL库,注意该参数必须放在源文件test.cpp后面,避免clang链接顺序校验失败-o test:指定输出的可执行文件名
编译完成后可执行以下命令验证链接结果:
otool -L ./test
如果输出中包含/usr/local/opt/openssl@3/lib/libssl.3.dylib和对应版本的libcrypto路径,说明链接正确,直接运行./test即可。
可选永久配置(避免每次编译输入长参数)
如果不想每次手动指定路径,可以把OpenSSL的编译参数加到shell配置中,以系统默认zsh为例:
- 打开
~/.zshrc文件,添加以下两行配置:
export CPPFLAGS="-I/usr/local/opt/openssl@3/include" export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
- 执行
source ~/.zshrc让配置生效,后续编译OpenSSL相关程序时,直接使用简化命令即可:
g++ -arch x86_64 test.cpp -lssl -lcrypto -o test
内容的提问来源于stack exchange,提问作者GhostDog98
相关产品推荐
相关产品推荐

