我有两个文件 - > fact.h
文件夹中的main.c
和/home/snyp1/new
。 main.c
的主要功能是调用fact(int x)
中的fact.h
函数。我正在使用ar命令创建.a
存档 - >
snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h fact.o libfact.a main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
我在ubuntu 12.04上。请让我知道什么是错的。 (另外,如果我不使用-L/.../new
,gcc会说它找不到“lfact”,也许是因为它不在/usr/local/lib
)
fact.h
构建fact.o
然后将其放入库中,因此无法按预期工作。所以我现在把它改成file.c
并且现在工作正常。我应该提供这些信息,对不起。虽然我不知道为什么会出现这种问题。如果没有至少一个.c
文件,库是否可以制作?
答案 0 :(得分:2)
我使用fact.h来构建fact.o然后将它放入库中,它没有按预期工作。
您的意思是说您正在编译fact.h
来制作fact.o
吗?
如果是这样,那就没有达到预期的效果。当您在头文件上调用gcc
时,它会生成一个预编译头,不一个目标文件。因此,虽然您有一个名为foo.o
的文件,但它不是有效的目标文件。如果您刚刚运行gcc -c fact.h
,它会产生一个预编译的标头fact.gch
,但可能是您运行了gcc -c fact.h -o fact.o
,导致该文件被称为fact.o
,即使它仍然是预编译的头。 file fact.o
会表明:
$ file fact.o
fact.o: GCC precompiled header (version 013) for C
您可以强制GCC通过运行gcc -x c -c fact.h -o fact.o
将文件视为C代码而不是标头(-x c
表示将输入视为C代码而不是从文件中推断出类型扩展)但是,只是简单地命名文件而不是尝试编译标题可能更简单,更容易混淆。
如果没有至少一个.c文件,库是否可以制作?
他们至少需要一个目标文件(即.o
文件)但你没有一个有效的对象,你有一个误导性标题为.o
的预编译标题,但它实际上并不是一个对象文件。
如果我不使用
-L/.../new
,gcc会说它找不到“lfact”,也许是因为它不在/usr/local/lib
链接器不仅查看/usr/local/lib
,还有其他默认位置,但是,这基本上就是问题所在。请注意,如果库位于当前目录中,您也可以说-L.
,这比提供绝对路径更容易。
答案 1 :(得分:1)
我不确定ar
是否支持除第一个选项以外的任何内容。尝试
ar -rs libfact.a fact.o
或只是
ar rs libfact.a fact.o
请注意,我不知道为什么跑ranlib
不起作用。