nm:无法识别文件格式

时间:2018-04-10 16:38:51

标签: c++ cmake linker

我正在尝试使用gcc工具链将库test.a链接到可执行文件中。

在使用cmake时,我从未体验过类似的东西,一切似乎都顺利进行,直到

> [100%] Linking CXX executable test
ar qc lib/test.a  CMakeFiles/test.dir/keys.cpp.o CMakeFiles/test.dir/test2.cpp.o  CMakeFiles/test.dir/test3.cpp.o  CMakeFiles/test.dir/test4.cpp.o  CMakeFiles/test.dir/test5.cpp.o  CMakeFiles/test.dir/test6.cpp.o 

链接器抱怨的地方

> test.a: error adding symbols: Archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status

test.a包含以下目标文件:

> ar -t test.a
test1.cpp.o
test2.cpp.o
test3.cpp.o
test4.cpp.o
test5.cpp.o
test6.cpp.o

nm无法识别文件的格式:

nm -s test.a
nm: test1.cpp.o: File format not recognized
nm: test2.cpp.o: File format not recognized
nm: test3.cpp.o: File format not recognized
nm: test4.cpp.o: File format not recognized
nm: test5.cpp.o: File format not recognized
nm: test6.cpp.o: File format not recognized

即使文件说这些是ascii文件:

file test1.cpp.o
test1.cpp.o: ASCII text

我被困住了。

我如何找出问题所在?

2 个答案:

答案 0 :(得分:1)

  

即使文件说这些是ascii文件

这就是你的问题:class文件应该是(编译的) object 文件,无论你的系统使用什么样的原生格式,不是 ASCII文件。

您很可能搞砸了.o(或Makefile)。但你没有展示它们,所以不能给予进一步的帮助。

P.S。命名文件CMakefile也非常不寻常 - 通常test1.cpp.o被编译为test1.cpp

答案 1 :(得分:1)

我有选项-MM作为编译标志,导致依赖列表而不是目标文件。