Erro de referência indefinido no gcc usando libnet [closed]

-1

Eu estou tentando compilar um programa C no gcc usando a biblioteca libnet. Eu tenho o arquivo libnet.h incluído no meu código, mas quando tento compilá-lo, recebo uma mensagem de erro:

/tmp/ccTEOH93.o: In function 'main':
random_name.c:(.text+0x2f): undefined reference to 'libnet_init'
random_name.c:(.text+0x72): undefined reference to 'libnet_seed_prand'
random_name.c:(.text+0x7c): undefined reference to 'libnet_get_prand'
random_name.c:(.text+0x8d): undefined reference to 'libnet_get_prand'
random_name.c:(.text+0x10a): undefined reference to 'libnet_name2addr4'
random_name.c:(.text+0x12e): undefined reference to 'libnet_name2addr4'
random_name.c:(.text+0x148): undefined reference to 'libnet_hex_aton'
random_name.c:(.text+0x163): undefined reference to 'libnet_hex_aton'
random_name.c:(.text+0x192): undefined reference to 'libnet_destroy'
collect2: error: ld returned 1 exit status

Eu tentei compilá-lo incluindo manualmente a biblioteca libnet.h ou a biblioteca libnet-functions.h (que inclui todas as funções acima) ao usar o gcc. Ainda nada funcionou. O compilador ainda envia uma mensagem de erro dizendo que a biblioteca não pôde ser localizada.

O que eu faço? Qual é o problema?

Eu tentei compilar navegando até o arquivo em que este programa está armazenado e digitando:

 gcc -o example example.c

ou

 gcc -o example example.c -l libnet.h (or just libnet)

isso funcionou ao compilar todos os meus outros programas e não consigo ver o que está errado. Eu até tentei alterando a ordem da minha entrada do gcc.

    
por just_a_tiny_fish 09.09.2017 / 16:00

1 resposta

2

Arquivos de cabeçalho e bibliotecas são coisas diferentes.

Um arquivo de cabeçalho (ou incluir arquivo ) contém declarações de objetos (especificando seu tipo, tamanho etc.). Os arquivos de cabeçalho são usados durante a fase de compilação de uma compilação, ou seja, ao converter o código-fonte em código de objeto específico da arquitetura. Os nomes dos cabeçalhos a serem incluídos são fornecidos no próprio código-fonte, e não na linha de comando do compilador, por exemplo

#include <foo.h>

Se um determinado arquivo de cabeçalho não estiver localizado no caminho de pesquisa padrão do compilador, caminhos adicionais poderão ser fornecidos na linha de comando, por exemplo,

gcc -o myprog.o -c -I/path/to/foo myprog.c

As bibliotecas, por outro lado, contêm o objeto real definitions , ou seja, as unidades pré-compiladas que implementam o objeto. Eles são usados durante a fase de link (quando seus arquivos de objeto são vinculados a qualquer biblioteca de sistema dependente para formar um programa executável) e são especificados na linha de comando, por exemplo

 gcc -o myprog myprog.o -lfoo

Aqui, -lfoo diz ao compilador para procurar por uma biblioteca com o nome libfoo.a ou libfoo.so (observe que o primeiro lib está implícito e é omitido na linha de comando, ou seja, -lfoo em vez de %código%). Como nos arquivos de cabeçalho, caminhos de bibliotecas não padrão podem ser acomodados usando a opção -llibfoo , por exemplo,

 gcc -o myprog myprog.o -L/path/to/foolib -lfoo

No seu caso, supondo que tanto o arquivo de cabeçalho quanto a biblioteca estejam localizados onde o compilador espera encontrar essas coisas, e que você queira compilar e vincular em um único comando, você provavelmente deve usar

gcc -o example example.c -lnet
    
por steeldriver 10.09.2017 / 18:21