我有两个文件 -> fact.hmain.c 在里面 /home/snyp1/new 文件夹。 main.c 有 main 函数调用 fact(int x) 函数于 fact.h. 。我正在创建一个 .a 使用 ar 命令存档 ->

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 文件在里面吗?

有帮助吗?

解决方案

我使用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

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

其他提示

我不确定,ar支持除第一个选项之外的任何内容。尝试

ar -rs libfact.a fact.o
.

或只是

ar rs libfact.a fact.o
.

心灵,我不知道为什么运行的ranlib不起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top