gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:49:49 25 4
gpt4 key购买 nike

我下载了 json-c库并尝试在我的环境(带有 Atom 和 gcc 的 Ubuntu)中进行一些基本测试。但是,我的 makefile 中似乎缺少一些内容,因为每次尝试编译时都会出现 undefined reference 错误。以下是我正在尝试运行的内容,

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


int main() {
struct json_object *jobj;
char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \
\"msg-from\": { \"class\": \"soldier\", \"name\": \"Wixilav\" }, \
\"msg-to\": { \"class\": \"supreme-commander\", \"name\": \"[Redacted]\" }, \
\"msg-log\": [ \
\"soldier: Boss there is a slight problem with the piece offering to humans\", \
\"supreme-commander: Explain yourself soldier!\", \
\"soldier: Well they don't seem to move anymore...\", \
\"supreme-commander: Oh snap, I came here to see them twerk!\" \
] \
}";

printf("str:\n---\n%s\n---\n\n", str);

jobj = json_tokener_parse(str);
printf("jobj from str:\n---\n%s\n---\n", json_object_to_json_string_ext(jobj, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY));

return 0;
}

根据网站,我应该使用这两个标志来链接到该库。

CFLAGS += $(shell pkg-config --cflags json-c)
LDFLAGS += $(shell pkg-config --libs json-c)

我在下面的 makefile 中这样做了,但它仍然不起作用。

CFLAGS += $(shell pkg-config --cflags json-c)
LDFLAGS += $(shell pkg-config --libs json-c)

CCBIN=/usr/bin/gcc
CC=$(CCBIN) $(CFLAGS) $(LDFLAGS) -Wall -Wextra -pedantic -std=c99 -g -fsanitize=address

default: json

json: json_type.c
$(CC) -O3 -o json json_type.c -lm

.PHONY: clean
clean:
rm -Rf *.o lib/*.o json *.dSYM

.PHONY: package
package:
tar -cvzf json.tar *

当我运行“make json”时,出现以下错误,

make json
/usr/bin/gcc -I/usr/local/include/json-c -L/usr/local/lib -ljson-c -Wall -Wextra -pedantic -std=c99 -g -fsanitize=address -O3 -o json json_type.c -lm
/tmp/ccXo2zav.o: In function `main':
/home/zachary/Atom_Projects/Projects/SandBox/JSON/json_type.c:25: undefined reference to `json_tokener_parse'
/home/zachary/Atom_Projects/Projects/SandBox/JSON/json_type.c:26: undefined reference to `json_object_to_json_string_ext'
collect2: error: ld returned 1 exit status
makefile:10: recipe for target 'json' failed
make: *** [json] Error 1

我对编写 makefile 非常陌生,所以希望这是一些愚蠢的事情。任何建议都会有帮助,谢谢!

最佳答案

链接器命令行上的目标文件和库的顺序很重要。按照遇到的顺序搜索库,以便找到满足前面对象中的依赖关系的函数。您将所有库放在需要它们的对象之前,因此它们实际上不会用于解析任何 undefined reference 。

此外,您非常规地使用了一些众所周知的 make 变量,并且完全没有使用 make 的内置默认值:

  • 变量CC,如果您选择重新定义它,则应包含运行 C 编译器的基本命令。通常这不包括任何标志:

    CC = gcc
    # or
    CC = /usr/bin/gcc
  • 然后,您可以将所需的所有 C 编译标志放入 CFLAGS 变量中:

    CFLAGS = -O3 $(shell pkg-config --cflags json-c) -Wall -Wextra -pedantic -std=c99 -g -fsanitize=address
  • 当 json-c 建议将 json-c 库选项放入 LDFLAGS 中时,我必须假设 json-c 是为了给您一个说明性示例,而不是一个秘诀。使用 GNU make,pkg-config --libs 的输出最好放入变量 LDLIBS 中:

    LDLIBS = $(shell pkg-config --libs json-c)
  • 话虽如此,如果您还依赖 make 的内置规则,那么以传统方式使用内置变量最为重要。这些对于您的情况来说完全足够了,因此您实际上不必在 makefile 中表达构建命令,只需适当的依赖关系即可:

    json: json_type.o

因此,假设 json-c 和 pkg-config 已正确安装,并且您正在使用 GNU make,则此 Makefile 应该足够了:

CC = /usr/bin/gcc

CFLAGS = -std=c99 -O3 -g
CFLAGS += $(shell pkg-config --cflags json-c)
CFLAGS += -fsanitize=address -Wall -Wextra -pedantic

LDLIBS = $(shell pkg-config --libs json-c)

all: json
json: json_type.o

clean:
rm -rf *.o json

.PHONY: clean

关于c - 如何让编译器识别对库的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49351440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com