Ошибка неопределенной ссылки в gcc с использованием libnet [закрыто]

Я пытаюсь скомпилировать программу C в gcc используя библиотеку libnet. У меня есть файл libnet.h, включенный в мой код, но когда я пытаюсь его скомпилировать, я получаю сообщение об ошибке:

/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

Я попытался скомпилировать его, вручную включив библиотеку libnet.h или libnet-functions.h библиотека (которая включает в себя все перечисленные выше функции) при использовании gcc. По-прежнему ничего не работало. Компилятор даже отправляет сообщение об ошибке, в котором говорится, что библиотека не может быть найдена.

Что мне делать? В чем проблема?

Я попытался скомпилировать его, просмотрев файл, в котором хранится эта программа, и затем набрал:

 gcc -o example example.c

или

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

, это сработало при компиляции всех моих других программ, и я не вижу, что это такое. неправильный. Я даже попробовал, изменив порядок ввода gcc.

-1
задан 10 September 2017 в 12:12

1 ответ

Заголовочные файлы и библиотеки являются разными вещами.

заголовочный файл А (или включают файл ) содержит объявления из объектов (указывающий их тип, размер и т.д.). Заголовочные файлы используются во время фазы компиляции сборки т.е. при преобразовании исходного кода в архитектурно-зависимый объектный код. Названия заголовков для включения даны в самом исходном коде, а не на командной строке компилятора, например

#include <foo.h>

, Если конкретный заголовочный файл не расположен на стандартном пути поиска компилятора, дополнительные пути могут быть даны на командной строке, например,

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

, Библиотеки, с другой стороны, содержат фактический объект определения т.е. предварительно скомпилированные единицы, которые реализуют объект. Они используются во время фазы ссылки (когда Ваши объектные файлы связаны с любыми зависимыми системными библиотеками для формирования исполняемой программы), и указаны на командной строке, например,

 gcc -o myprog myprog.o -lfoo

Здесь, -lfoo говорит компилятору искать библиотеку с именем libfoo.a, или libfoo.so (обратите внимание, что продвижение lib подразумевается и опущено на командной строке т.е. -lfoo, а не -llibfoo). Как с заголовочными файлами, нестандартные пути к библиотеке могут быть размещены с помощью, опции -L например,

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

, В случае, предположив, что и заголовочный файл и библиотека расположены, где компилятор ожидает находить эти вещи, и что Вы хотите скомпилировать и связаться в единственной команде, необходимо, вероятно, использовать

gcc -o example example.c -lnet
2
ответ дан 2 November 2019 в 07:17

Другие вопросы по тегам:

Похожие вопросы: