Неопределенная ошибка ссылки в 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 в 22:12

2 ответа

Файлы заголовков и библиотеки - это разные вещи.

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

#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
ответ дан 18 July 2018 в 07:08

Файлы заголовков и библиотеки - это разные вещи.

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

#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
ответ дан 24 July 2018 в 18:44