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