You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让编译器识别对json-c库的引用?

解决json-c编译时的未定义引用问题

你遇到的这个「未定义引用」错误,本质是链接阶段没找到json-c的库文件——你只在代码里包含了json.h头文件,这能让编译器知道函数的声明,但链接器需要找到实际的库二进制文件才能生成可执行程序。我来一步步帮你搞定:

一、先确认json-c的安装状态

如果你是通过Ubuntu官方源安装的json-c(这是最省心的方式),先确保依赖已经装全:

sudo apt install libjson-c-dev libjson-c3

要是你是手动下载源码编译安装的,得记清楚库文件(一般是libjson-c.so)和头文件的位置,通常在/usr/local/lib/usr/local/include目录下。

二、快速测试:直接用gcc命令编译

首先得修正你的测试代码——原代码里的JSON字符串没闭合(结尾的{...不完整),这会导致语法错误,我帮你调整成了可正常解析的完整格式:

#include "json.h"
#include <stdio.h>

int main() {
    struct json_object *jobj;
    // 修正后的完整JSON字符串
    char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \"msg-from\": { \"class\": \"soldier\", \"name\": \"Wixilav\" }, \"msg-to\": \"test-target\" }";
    
    jobj = json_tokener_parse(str);
    if (jobj == NULL) {
        printf("JSON解析失败\n");
        return 1;
    }
    
    printf("解析后的JSON对象:%s\n", json_object_to_json_string(jobj));
    json_object_put(jobj); // 记得释放内存,避免泄漏
    return 0;
}

然后用下面的命令编译,关键是加上-ljson-c参数告诉链接器要链接json-c库:

gcc json_test.c -o json_test -ljson-c

如果是手动安装的库,还需要额外指定头文件和库文件的路径:

gcc json_test.c -o json_test -L/usr/local/lib -ljson-c -I/usr/local/include

这里-L用来指定库文件所在目录,-I指定头文件所在目录,根据你实际的安装路径调整就行。

三、正确配置Makefile

如果想用Makefile管理编译,这里给你两种场景的配置:

场景1:系统默认安装的json-c

CC = gcc
# 开启基础的警告提示,帮助排查代码问题
CFLAGS = -Wall -Wextra
# 链接json-c库
LDFLAGS = -ljson-c

# 生成的可执行文件名称
TARGET = json_test
# 你的源码文件
SRCS = json_test.c

all: $(TARGET)

$(TARGET): $(SRCS)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

# 清理生成的可执行文件
clean:
    rm -f $(TARGET)

场景2:手动编译安装的json-c

CC = gcc
# 指定json-c头文件的目录
CFLAGS = -Wall -Wextra -I/usr/local/include
# 指定json-c库文件的目录并链接库
LDFLAGS = -L/usr/local/lib -ljson-c

TARGET = json_test
SRCS = json_test.c

all: $(TARGET)

$(TARGET): $(SRCS)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

clean:
    rm -f $(TARGET)

把这个Makefile和你的源码放在同一目录,运行make就能自动编译了,想清理的话运行make clean

四、进阶排查技巧

如果还是报错,试试用pkg-config工具自动获取编译参数——json-c支持pkg-config,能帮你自动适配不同的安装路径:

# 查看头文件路径参数
pkg-config --cflags json-c
# 查看库链接参数
pkg-config --libs json-c

把这两个命令的结果直接拼到gcc命令里,省得手动输路径:

gcc json_test.c -o json_test $(pkg-config --cflags --libs json-c)

内容的提问来源于stack exchange,提问作者Zach466920

火山引擎 最新活动