You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下用CMake链接json-c共享库时无法找到json.h的求助

解决CMake链接json-c时头文件找不到的问题

首先排查两个核心问题:路径错误和CMake配置未正确引入头文件目录,以下是具体解决方案:

1. 修正CMAKE_PREFIX_PATH路径

从你的目录结构看,json-c-master直接在base目录下,但你执行cmake时指定的路径是/home/<username>/base/project1/json-c-master,这明显不对,正确路径应该是:

cd build
cmake -DCMAKE_PREFIX_PATH=/home/<username>/base/json-c-master ..

2. 调整CMakeLists.txt配置(两种可选方案)

方案一:手动指定头文件和库(适合未安装json-c的情况)

因为你只是在json-c源码目录编译了库,没有执行make install,大概率没有生成CMake所需的json-cConfig.cmake配置文件,导致find_package(json-c CONFIG)未生效。直接手动指定包含目录和库路径更可靠:

修改根目录的CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(project1)
# 你的项目是C语言,设置C标准而非C++
set(CMAKE_C_STANDARD 11)

# 源文件不需要包含头文件,CMake会自动处理依赖
set(SOURCES src/main.c src/project1.c )
add_executable(project1 ${SOURCES})

# 查找json-c库文件
find_library(JSON_C_LIB NAMES json-c PATHS ${CMAKE_PREFIX_PATH})
if(NOT JSON_C_LIB)
    message(FATAL_ERROR "找不到json-c库文件,请检查路径是否正确")
endif()

# 添加json-c头文件所在目录
target_include_directories(project1 PRIVATE ${CMAKE_PREFIX_PATH})

# 链接json-c库
target_link_libraries(project1 PRIVATE ${JSON_C_LIB})

方案二:安装json-c后使用find_package(更规范的方式)

如果你希望用find_package,先把json-c安装到指定目录:

cd base/json-c-master
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/home/<username>/local/json-c ..
make && make install

然后修改根目录CMakeLists.txt,并调整cmake命令:

cmake_minimum_required(VERSION 3.10)
project(project1)
set(CMAKE_C_STANDARD 11)

set(SOURCES src/main.c src/project1.c )
add_executable(project1 ${SOURCES})

# 查找安装后的json-c配置
find_package(json-c REQUIRED CONFIG)
target_link_libraries(project1 PRIVATE json-c::json-c)

执行cmake时指定安装路径:

cd build
cmake -DCMAKE_PREFIX_PATH=/home/<username>/local/json-c ..

注意:安装后json-c的头文件通常在/home/<username>/local/json-c/include/json-c/,所以你代码里的#include "json.h"要改成#include <json-c/json.h>,或者在CMake里添加target_include_directories(project1 PRIVATE ${JSON_C_INCLUDE_DIRS})(find_package会自动设置JSON_C_INCLUDE_DIRS变量)。

额外提示

  • 不要把.h头文件加到SOURCES列表里,CMake会自动检测源文件的头文件依赖,添加进去反而可能引发不必要的问题。
  • 编译时如果出现库找不到的错误,可以在cmake命令里加上-DCMAKE_VERBOSE_MAKEFILE=ON,查看具体的编译链接命令,排查路径问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:50:19