链接错误 - 使用 nm 修复

Posted

技术标签:

【中文标题】链接错误 - 使用 nm 修复【英文标题】:Linking Error - Use nm to fix 【发布时间】:2012-10-15 17:38:11 【问题描述】:

我有一个链接错误,我应该在 Unix 上使用 nm 命令修复它。

如果我有以下链接错误:undefined reference to 'program_name',并且在该目标文件上运行nm 时,program_name 符号在符号表中显示如下:U program_name

我知道program_name 是未定义的,并且定义在另一个需要包含在原始目标文件中的目标文件中。我的问题是:我怎样才能找到它是哪个目标文件?那可能吗?我在一个目录中有一堆目标文件,它就是其中之一。太多了,无法全部尝试。

【问题讨论】:

您还可以将所有目标文件放入存档库并链接。 【参考方案1】:

是的。您将在已定义符号的目标文件中找到 T(用于“文本段”),而不是输出中的 U。像这样的东西应该可以工作(在 bash 中):

for f in *.o; do if (nm "$f" | grep 'T program_name'); then echo "$f" matches; fi; done

在这里,我循环遍历所有 *.o 文件,无论哪个定义了符号,都会打印出它们的文件名。

【讨论】:

【参考方案2】:

你可以这样做:

$ nm *.o 

在输出中查找program_name(假设您的目标文件有.o 扩展名)。

【讨论】:

【参考方案3】:

尝试nm -o *.o |grep program_name 并查找符号类型为“T”的 .o 文件(假设它是函数名)。 nm 的 -o 选项为每一行添加文件名前缀。根据您的操作系统,nm 可能有也可能没有此选项(也可能是-A),因此请查看您的联机帮助页。如果它根本不存在,那么您需要编写一个 shell for 循环,类似于

for obj in *.obj; do 
  echo $obj:
  nm $obj | grep program_name
done`

【讨论】:

以上是关于链接错误 - 使用 nm 修复的主要内容,如果未能解决你的问题,请参考以下文章

使用 npm 链接时如何修复“任务不在您的 gulpfile 中”错误?

如何修复 Apple Mach-O 链接器错误

如何修复 Xcode 中的“_sqlite3_prepare_v3”链接器错误

配置 Qt .pro 文件以使用 cl.exe 和 link.exe 来修复链接错误

如何修复编译 Mach-O 链接器错误

如何修复损坏的链接 wordpress web config rewrite index.php 损坏站点链接错误 404