我正在尝试使用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
我被困住了。
我如何找出问题所在?
答案 0 :(得分:1)
即使文件说这些是ascii文件
这就是你的问题:class
文件应该是(编译的) object 文件,无论你的系统使用什么样的原生格式,不是 ASCII文件。
您很可能搞砸了.o
(或Makefile
)。但你没有展示它们,所以不能给予进一步的帮助。
P.S。命名文件CMakefile
也非常不寻常 - 通常test1.cpp.o
被编译为test1.cpp
。
答案 1 :(得分:1)
我有选项-MM作为编译标志,导致依赖列表而不是目标文件。