我有一个链接错误,我应该在Unix上使用nm
命令修复。
如果我遇到以下链接错误:undefined reference to 'program_name'
,并且在该对象文件上运行nm
时,符号表中的program_name
符号如下所示:U program_name
我知道program_name
未定义,并且在另一个需要包含在原始目标文件中的目标文件中定义。我的问题是:我怎样才能找到它是哪个目标文件?那可能吗?我在目录中有一堆目标文件,它将是其中之一。尝试所有这些方法太多了。
答案 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`