链接错误 - 使用nm修复

时间:2012-10-15 17:38:12

标签: c unix gcc linker nm

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

如果我遇到以下链接错误:undefined reference to 'program_name',并且在该对象文件上运行nm时,符号表中的program_name符号如下所示:U program_name

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

3 个答案:

答案 0 :(得分:3)

是。您将在对象文件中找到具有已定义符号的U(用于“文本段”),而不是输出中的T。这样的事情应该有效(在bash中):

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

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

答案 1 :(得分:1)

你可以这样做:

$ nm *.o 

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

答案 2 :(得分:0)

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

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