是否不允许创建没有.c文件的静态库?

时间:2012-07-28 22:56:03

标签: gcc static-libraries ar

我有两个文件 - > fact.h文件夹中的main.c/home/snyp1/newmain.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文件,库是否可以制作?

2 个答案:

答案 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不起作用。