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
相关产品推荐
相关产品推荐

