1

我在为 json 编译不同的库时遇到了太多问题,最后我得到了一个已经编译的 json 库,它是要与我的项目链接的 cJSON,但是当我下载它时,并将它与一个测试 c 文件链接起来,例如:

//file1.c    
 #include "cJSON.h"
    ...
    ...
    ...

然后我使用命令通过 gcc 编译它:

gcc file1.c -lcJSON

它返回:

file1.c:7:19: fatal error: cJSON.h: No such file or directory
 #include "cJSON.h"
4

2 回答 2

3

好吧,最后经过几次尝试,我成功地找出了问题并解决了它。由于 cJSON 是一个静态库,所以我无法执行动态链接,例如:-lcJSON,编译 file1.c 并将 cJSON 库链接到它的完美方法是:

  1. 将 cJSON.c 和 cJSON.h 文件添加到 file1.c 的同一目录中。
  2. 在 file1.c 中包含“cJSON.h”。
  3. 执行命令gcc cJSON.c file1.c -lm

最后编译成功。

于 2015-11-30T11:59:56.057 回答
0

头库的正确路径是#include <cjson/cJSON.h>使用默认 Makefile 配置安装时。

另外,编译命令不正确,cJSON库cjson全小写安装。因此,使用gcc file1.c -lcjson它会起作用。

正如@Zainab 所说,"文件名周围的双引号是当头文件与您正在编译的文件位于同一目录内时。小于/大于符号<>用于指定系统上已安装的库。

列出系统上已安装的库(假设您在 *NIX 系统上,您可以运行ldconfig -p)。当 grepping 它ldconfig -p | grep 'cJSON'什么都没有返回时,而 grepping withcjson确实返回结果:

        libcjson_utils.so.1 (libc6,x86-64) => /usr/lib/libcjson_utils.so.1
        libcjson_utils.so (libc6,x86-64) => /usr/lib/libcjson_utils.so
        libcjson.so.1 (libc6,x86-64) => /usr/lib/libcjson.so.1
        libcjson.so (libc6,x86-64) => /usr/lib/libcjson.so

更讽刺的是,使用cjson/cjson.h头文件不起作用,而cjson/cJSON.h确实起作用。

于 2021-10-31T23:30:41.077 回答