是否不允许创建没有 .c 文件的静态库?
-
13-12-2019 - |
题
我有两个文件 -> fact.h
和 main.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
不起作用。