根本原因是链接阶段找不到libnnz11.so中的符号,需在ins_emagent.mk中$(SYSMANBIN)emdctl:规则后追加-lnnz11,并确保$ORACLE_HOME/lib/libnnz11.so存在且权限正确。
ins_emagent.mk 报错 “Error in invoking target ‘agent nmhs’” 的根本原因
这不是语法错误或路径缺失,而是链接阶段找不到 libnnz11.so 中的符号(比如 b_destroykeyobject)。oracle 11g 安装时的 ins_emagent.mk 默认没显式链接 libnnz11,但 nmectl 目标又依赖它——尤其在较新 glibc 或非 oracle uek 内核的系统(如 centos 7、rhel 8)上极易暴露。
如何定位并修改 ins_emagent.mk 中的 MK_EMAGENT_NMECTL 行
别全局替换,只改真正触发链接的那行。常见位置在 $(SYSMANBIN)emdctl: 规则下,紧跟着的命令行才是关键。
- 先确认路径:
$ORACLE_HOME/sysman/lib/ins_emagent.mk - 用
grep -n 'MK_EMAGENT_NMECTL' ins_emagent.mk找到行号(通常在 180–195 行之间) - 目标行形如:
$(SYSMANBIN)emdctl: $(MK_EMAGENT_NMECTL),注意它后面**没有反斜杠续行符**,是独立一行 - 在这行末尾加空格和
-lnnz11,变成:$(SYSMANBIN)emdctl: $(MK_EMAGENT_NMECTL) -lnnz11 - 改完立刻保存,不要改动其他无关行(比如
nmo或nmhs单独规则,它们不走这个变量)
用 sed 一键修复但必须避开常见陷阱
命令看似简单,但实际执行时容易因空格、缩进或行尾符失败。下面这条是经过验证的:
sed -i '/^\s*$(SYSMANBIN)emdctl:/!b;n;s/\$\(MK_EMAGENT_NMECTL\)/\$\1 -lnnz11/' $ORACLE_HOME/sysman/lib/ins_emagent.mk
说明:
- 它先匹配
$(SYSMANBIN)emdctl:开头的行,再取下一行(n命令),确保只动真正调用MK_EMAGENT_NMECTL的那条命令 - 不依赖行首空格数量,也不假设
MK_EMAGENT_NMECTL必须独占一行 - 如果用网上流传的
s/^\s*\$(MK_EMAGENT_NMECTL)\s*$/\1 -lnnz11/g,很可能匹配不到——因为原行往往带其他参数或注释 - 执行前务必备份:
cp ins_emagent.mk ins_emagent.mk.bak
改完不生效?检查 libnnz11.so 是否真的可被链接器找到
加了 -lnnz11 只是告诉链接器“要连这个库”,但它得先找得到。常见断点:
-
libnnz11.so一般在$ORACLE_HOME/lib/下,确认存在:ls -l $ORACLE_HOME/lib/libnnz11.so - 如果只有
.a静态库,链接会失败;必须是.so动态库 - 安装用户(如
oracle)对$ORACLE_HOME/lib有读+执行权限,否则ld进程无法扫描目录 - 不要手动设
LD_LIBRARY_PATH来“绕过”这个问题——OUI 安装进程不继承 shell 环境变量,无效
最稳妥的做法:确保 $ORACLE_HOME/lib 在 /etc/ld.so.conf.d/oracle.conf 里,并运行 ldconfig,但这在安装中途通常来不及,所以优先确认文件存在且权限正确。


















