我正在尝试编译一个使用 libconfig 的 C 项目。我已经安装了libconfig8-dev
软件包,并尝试检索编译项目所需的 c 标志。运行pkg-config --libs libconfig
结果符合预期,但是pkg-config --cflags libconfig
,没有返回任何内容。此外,里面没有libconfig.pc
文件/usr/lib/pkgconfig/
。我的 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'
。
答案1
您可能会.pc
在以下位置找到文件/usr/lib/x86_64-linux-gnu/pkgconfig/
不返回任何内容并不罕见pkg-config --cflags
:它只是意味着不需要额外的标志(例如,所有必需的头文件都在标准包含路径上)。
无论如何,CFLAGS
涉及编译阶段构建,而不是链接阶段- 这是发生未定义符号错误的地方。
您的问题可能是您以错误的顺序链接库和目标文件:例如参见为什么 gcc 中 '-l' 选项的顺序很重要?因此尝试
$(BINDIR)/$(TARGET): $(OBJECTS)
$(CC) -o $@ $(OBJECTS) $(LFLAGS) $(LDLIBS)
@echo "Linking complete!"
此外,在链接阶段指定包含路径是没有意义的;如果您需要从当前目录链接库,则替换
LFLAGS = -Wall -I. -pthread
经过
LFLAGS = -Wall -L. -pthread
(尽管说实话我不确定这-Wall
在链接阶段是否有任何影响)。