Я пытаюсь скомпилировать проект C, который использует libconfig. Я установил пакет libconfig8-dev, и я пытаюсь извлечь флаговые c, необходимые для компиляции проекта. Запуск pkg-config --libs libconfig работает так, как ожидалось, однако pkg-config --cflags libconfig ничего не возвращает. Кроме того, внутри /usr/lib/pkgconfig/ нет файла libconfig.pc. Мой файл make выглядит следующим образом:
TARGET = uartIO
CFLAGS = -Wall -I. -pthread `pkg-config --cflags libconfig`
LFLAGS = -Wall -I. -pthread
LDLIBS = `pkg-config --libs libconfig`
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
debug: CFLAGS += -g
debug: $(BINDIR)/$(TARGET)
$(BINDIR)/$(TARGET): $(OBJECTS)
$(CC) $(LFLAGS) $(LDLIBS) $(OBJECTS) -o $@
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
.PHONY: clean
clean:
@$(rm) $(OBJECTS)
@echo "Cleanup complete!"
.PHONY: remove
remove: clean
@$(rm) $(BINDIR)/$(TARGET)
@echo "Removal complete!"
Компиляция приводит к различным ошибкам о неопределенных функциях, например, undefined reference to 'config_init'.
Скорее всего, вы найдете файл .pc в /usr/lib/x86_64-linux-gnu/pkgconfig/
. Для pkg-config --cflags нет ничего необычного: это означает, что дополнительные флаги не требуются (например, все необходимые файлы заголовков находятся на стандартном пути include).
В любом случае, CFLAGS относятся к фазе компиляции сборки, а не к фазе связи - в которой происходят неопределенные ошибки символов.
Ваша проблема, вероятно, связывание библиотек и объектных файлов в неправильном порядке: см. например, Почему параметр «-l» в gcc имеет значение? Поэтому попробуйте
$(BINDIR)/$(TARGET): $(OBJECTS)
$(CC) -o $@ $(OBJECTS) $(LFLAGS) $(LDLIBS)
@echo "Linking complete!"
Кроме того, нет смысла указывать путь включения во время фазы ссылки; если вам нужно связать библиотеки с текущим каталогом, замените
LFLAGS = -Wall -I. -pthread
на
LFLAGS = -Wall -L. -pthread
(хотя TBH я не уверен, что -Wall имеет какой-либо эффект во время фаза связи).
Скорее всего, вы найдете файл .pc в /usr/lib/x86_64-linux-gnu/pkgconfig/
. Для pkg-config --cflags нет ничего необычного: это означает, что дополнительные флаги не требуются (например, все необходимые файлы заголовков находятся на стандартном пути include).
В любом случае, CFLAGS относятся к фазе компиляции сборки, а не к фазе связи - в которой происходят неопределенные ошибки символов.
Ваша проблема, вероятно, связывание библиотек и объектных файлов в неправильном порядке: см. например, Почему параметр «-l» в gcc имеет значение? Поэтому попробуйте
$(BINDIR)/$(TARGET): $(OBJECTS)
$(CC) -o $@ $(OBJECTS) $(LFLAGS) $(LDLIBS)
@echo "Linking complete!"
Кроме того, нет смысла указывать путь включения во время фазы ссылки; если вам нужно связать библиотеки с текущим каталогом, замените
LFLAGS = -Wall -I. -pthread
на
LFLAGS = -Wall -L. -pthread
(хотя TBH я не уверен, что -Wall имеет какой-либо эффект во время фаза связи).
Скорее всего, вы найдете файл .pc в /usr/lib/x86_64-linux-gnu/pkgconfig/
. Для pkg-config --cflags нет ничего необычного: это означает, что дополнительные флаги не требуются (например, все необходимые файлы заголовков находятся на стандартном пути include).
В любом случае, CFLAGS относятся к фазе компиляции сборки, а не к фазе связи - в которой происходят неопределенные ошибки символов.
Ваша проблема, вероятно, связывание библиотек и объектных файлов в неправильном порядке: см. например, Почему параметр «-l» в gcc имеет значение? Поэтому попробуйте
$(BINDIR)/$(TARGET): $(OBJECTS)
$(CC) -o $@ $(OBJECTS) $(LFLAGS) $(LDLIBS)
@echo "Linking complete!"
Кроме того, нет смысла указывать путь включения во время фазы ссылки; если вам нужно связать библиотеки с текущим каталогом, замените
LFLAGS = -Wall -I. -pthread
на
LFLAGS = -Wall -L. -pthread
(хотя TBH я не уверен, что -Wall имеет какой-либо эффект во время фаза связи).