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