Я пытаюсь проверить, была ли моя установка libfyaml успешной, так как мне нужно использовать библиотеку в проекте. Я собрал его из исходников, и установка прошла нормально, но когда я скомпилирую тестовую программу с помощью gcc test.c -o test
, я получаю эту ошибку:
/usr/bin/ld: /tmp/ccPsUk6E.o: in function `main':
test.c:(.text+0x14): undefined reference to `fy_library_version'
collect2: error: ld returned 1 exit status
Я проверил путь и действительно libfyaml.h
находится в /usr/local/include
. Путь также подходит, и GCC указывает его как путь для заголовков. Я также пробовал использовать варианты -I
, -l
и -L
. Тем не менее, это все еще дает ту же ошибку.
Как решить эту проблему? Я на Ubuntu 20 (WSL).
Тестовая программа для справки:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <libfyaml.h>
int main(int argc, char *argv[])
{
printf("%s\n", fy_library_version());
return EXIT_SUCCESS;
}
Ссылка на библиотеку: Гитхаб
Если библиотека не является библиотекой только для заголовков (где все функции находятся в файлах заголовков), существует фактическая библиотека, с которой вам нужно связать. Как вы установили библиотеку в свою систему? Вы сами собрали из исходников? Использовать менеджер пакетов? Если вы собирали его из исходного кода, создавался ли он фактический файл библиотеки (файл с именем что-то вроде libfyaml.a
или подобное)? Если вы установили с помощью менеджера пакетов, просто попробуйте добавить -lfyaml
в конце командной строки при сборке.
@HolyBlackCat Я использовал его с -llibfyaml. Я вижу, что я сделал неправильно, извините, это первый раз, когда я использую библиотеку не по умолчанию.
@Someprogrammerdude Я построил его из исходного кода, и это просто libfyaml.h
файл в папке include.
Есть ли каталог lib
? Какие файлы он содержит?
@Someprogrammerdude Извините, я раньше не заглядывал в этот каталог. Не обращайте внимания на мой предыдущий комментарий. Да, есть файлы .a, .la, .so, .so.0 и .so.0.0.0 для libfyaml
libfyaml.
не было ни в одной папке, которую ищет компилятор, вы получили бы другое сообщение, указывающее, что этот файл не найден. Вместо этого ваш компоновщик сообщает вам, что какой-то символ, который вы используете, отсутствует.
Когда вы включаете библиотеки, вам нужно передать аргумент -l
компилятору.
Не цитируйте меня по этому поводу, но, судя по названию, имя библиотеки будет "fyaml", поэтому команда выглядит следующим образом
gcc test.c -o test.o -lfyaml
GCC состоит из двух основных компонентов: компилятора и компоновщика. Включение заголовков — это та часть, которую вы делаете правильно, и вы, по сути, сообщаете компилятору, что fy_library_version
вызывается с правильными аргументами и возвращаемым типом.
Однако компилятор не знает, что происходит после вызова такой функции, и обязанность проверки существования кода для этой функции переносится на более позднюю стадию: компоновщика.
Компоновщик действительно вызывает ошибку, которую вы видите
ld returned 1 exit status
Это связано с тем, что компоновщик не знает, какие библиотеки вы используете, и, следовательно, не может знать, где найти код для ваших функций. Чтобы исправить это, вы должны сообщить gcc, какие библиотеки вы используете:
gcc test.c -lfyaml -o test
Спасибо. Это сработало. Я пробовал с -llibfyaml, что, конечно же, не сработало. Как вывести имя библиотеки fyaml
из libfyaml
?
Это соглашение, обычно если библиотека называется libsomething, которую вы связываете с -lsomething.
Вам нужно
-l
. Как именно вы пытались его использовать?