Solaris 11 Sparc编译net-snmp 5.7.3时遇编译错误求助
解决Solaris 11 Sparc平台编译net-snmp 5.7.3的make错误
我之前在Solaris 11 Sparc环境下编译旧版本net-snmp时碰到过几乎一模一样的错误,给你几个经过验证的解决思路:
错误原因分析
你看到的keytools.c里的指针转换警告和void表达式错误,本质是net-snmp 5.7.3的加密逻辑代码和Solaris 11自带的加密库/编译器环境不兼容,尤其是generate_Ku函数里对加密API的调用处理不符合Solaris平台的规范。
解决方案1:强制使用OpenSSL库编译
Solaris自带的加密工具链兼容性较差,我们可以指定用OpenSSL来处理加密部分,这是最稳妥的方案:
- 先确认你已经安装了OpenSSL(可以通过
pkg install openssl或者从OpenCSW仓库执行pkgutil -i openssl安装) - 清理之前的编译缓存,重新运行configure:
make clean && rm -rf config.log config.status ./configure --prefix=/opt --with-openssl=/usr/sfw # 如果你的OpenSSL装在/opt/csw就改成对应路径 - 重新执行
make && make install
解决方案2:直接修改keytools.c代码适配
如果不想折腾依赖,可以手动修复报错的代码:
- 打开
/scratch/kkumsati/net-snmp/snmplib/keytools.c - 定位到
generate_Ku函数:- 第153行的指针赋值警告:给返回值添加强制类型转换,比如如果是调用
EVP_MD_CTX_create(),改成:ctx = (EVP_MD_CTX *) EVP_MD_CTX_create(); - 第161、166行的void表达式错误:这两行大概率是把返回
void的加密函数(比如EVP_DigestUpdate)当成有返回值的函数来赋值了,直接去掉赋值操作即可,比如把ret = EVP_DigestUpdate(ctx, buf, len);改成EVP_DigestUpdate(ctx, buf, len);
- 第153行的指针赋值警告:给返回值添加强制类型转换,比如如果是调用
- 保存修改后,重新执行
make
解决方案3:调整编译参数修正宏定义问题
你的configure自动生成的编译参数里有-Usolaris2 -Dsolaris2=solaris2,这会导致系统宏定义混乱,尝试手动指定CFLAGS:
make clean && rm -rf config.log config.status ./configure --prefix=/opt CFLAGS="-fno-strict-aliasing -g -O2 -D__SOLARIS__" make
额外注意事项
- 确保你PATH里的gcc是较新版本的(比如gcc 4.8及以上),Solaris自带的gcc版本可能太低,建议使用SFW或者OpenCSW提供的gcc
- 确认安装了所有必要的依赖包:比如
libcrypto、libssl的开发包,还有automake、autoconf这些构建工具
内容的提问来源于stack exchange,提问作者skm_satish
相关产品推荐
相关产品推荐

