Pergunta

Eu tenho dois arquivos -> fact.h e main.c no /home/snyp1/new pasta. main.c tem a função principal que chama o fact(int x) funcionar em fact.h.Estou criando um .a arquivar com o comando 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

Estou no Ubuntu 12.04.Por favor, deixe-me saber o que há de errado.(Além disso, se eu não usar o -L/.../new, o gcc dirá que não consegue encontrar "lfact", talvez seja porque não está em /usr/local/lib)

EDITAR:OK, encontrei a causa.É devido ao fato de eu estar usando fact.h para construir o fact.o e depois colocá-lo na biblioteca, não funcionou como esperado.Então agora mudei para file.c e está funcionando bem agora.Eu deveria ter fornecido essa informação, sinto muito.Embora eu não saiba por que esse tipo de problema deveria surgir.Não é possível criar bibliotecas sem pelo menos um .c arquivo nele?

Foi útil?

Solução

Eu estava usando fact.h para construir o fact.o e depois colocá-lo na biblioteca, não estava funcionando como esperado.

Você quer dizer que você estava compilando fact.h para produzir fact.o?

Se sim, isso não estava fazendo o que você esperava.Quando você invoca gcc em um arquivo de cabeçalho produz um cabeçalho pré-compilado, não um arquivo objeto.Então, embora você tenha um arquivo chamado foo.o não era um arquivo de objeto válido.Se você tivesse acabado de correr gcc -c fact.h teria produzido um cabeçalho pré-compilado fact.gch, mas provavelmente você correu gcc -c fact.h -o fact.o o que faz com que o arquivo seja chamado fact.o mesmo que ainda seja um cabeçalho pré-compilado. file fact.o teria mostrado que:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

Você poderia ter forçado o GCC a tratar o arquivo como código C, não como um cabeçalho, executando gcc -x c -c fact.h -o fact.o (o -x c diz para tratar a entrada como código C em vez de inferir o tipo da extensão do arquivo), mas provavelmente é mais simples e menos confuso apenas nomear seu arquivo corretamente em vez de tentar compilar um cabeçalho.

Não é possível criar bibliotecas sem pelo menos um arquivo .c?

Eles precisam de pelo menos um arquivo objeto (ou seja, .o arquivo), mas você não tinha um objeto válido, você tinha um cabeçalho pré-compilado erroneamente nomeado como .o, mas na verdade não era um arquivo objeto.

se eu não usar o -L/.../new, o gcc dirá que não consegue encontrar "lfact", talvez seja porque não está em /usr/local/lib

O vinculador não olha apenas /usr/local/lib, existem outros locais padrão, mas sim, esse é basicamente o problema.Observe que você também pode dizer -L. se a biblioteca estiver no diretório atual, é mais fácil do que fornecer um caminho absoluto.

Outras dicas

Eu não tenho certeza ar suporta um travessão em qualquer coisa que não seja a primeira opção.Tentar

ar -rs libfact.a fact.o

ou apenas

ar rs libfact.a fact.o

Veja bem, não sei por que correr ranlib não funcionou embora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top