1

我有两个文件->fact.h和文件夹中main.c。具有调用函数的 main 函数。我正在使用 ar 命令创建存档 ->/home/snyp1/newmain.cfact(int x)fact.h.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文件,就不能制作库吗?

4

2 回答 2

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 将文件视为 C 代码,而不是标头gcc -x c -c fact.h -o fact.o-x c说将输入视为 C 代码,而不是从文件扩展名中推断类型),但仅命名您的文件可能更简单且更容易混淆文件正确,而不是尝试编译头文件。

如果没有至少一个 .c 文件,就不能制作库吗?

他们至少需要一个目标文件(即.o文件),但您没有有效的对象,您有一个被误导性命名为的预编译头文件.o,但它实际上不是目标文件。

如果我不使用-L/.../new,gcc 会说它找不到“lfact”,可能是因为它不在/usr/local/lib

链接器不仅会查看 in /usr/local/lib,还会查看其他默认位置,但是是的,这基本上就是问题所在。请注意,您也可以说-L.库是否在当前目录中,这比提供绝对路径更容易。

于 2012-07-29T01:29:06.680 回答
1

ar除了第一个选项之外,我不确定是否支持破折号。尝试

ar -rs libfact.a fact.o

要不就

ar rs libfact.a fact.o

请注意,我不知道为什么跑步ranlib不起作用。

于 2012-07-28T23:27:12.783 回答