1

我对makefile很陌生。我正在使用命令从终端编译包含 cJson 库的 c 代码文件

gcc -test1.c -o test -lcjson

最后使用 -lcjson 并且运行完美。但是如何使用makefile编译相同的代码,因为我最后必须添加-lcjson。如果我在没有 -lcjson 的情况下使用,我会收到错误

/tmp/cc4ESrx1.o: In function `parse_json':
test1.c:(.text+0x2d): undefined reference to `cJSON_Parse'
test1.c:(.text+0x42): undefined reference to `cJSON_GetObjectItem'
test1.c:(.text+0x59): undefined reference to `cJSON_GetObjectItem'
collect2: error: ld returned 1 exit status

我正在使用 RTOS 代码

提前致谢

4

1 回答 1

0

首先,避免命名您的可执行文件,test因为它是标准程序名称(至少在 POSIX 上)。

然后,阅读GNU make 的文档。它包含一个教程部分。

最后,GNU make 有几个内置的规则,你可以使用make -p

有关示例,请参见此答案。

我强烈建议使用所有警告和调试信息进行编译(即,gcc -Wall -Wextra -g如果使用GCC)。所以把CFLAGS+= -Wall -Wextra -gandCC=gcc放在你的Makefile.

与您的-lcjson 添加链接到LIBES+= -lcjson您的Makefile. 请记住,tab字符在 a 中很重要Makefile(因此请使用一些编辑器,例如emacs,能够编辑它们)。

所以试试:

# your Makefile, replace four spaces with tab
CC= gcc
CFLAGS+= -Wall -Wextra -g
RM= rm -f
MY_SOURCES=$(wildcard *.c)
## above could be an MY_SOURCES= file1.c file2.c otherfile.c
MY_OBJECTS=$(patsubst %.c,%.o,$(MY_SOURCES))
# 
LIBES= -lcjson
#
.PHONY: all clean
##
all: myprog
## 
clean:
     $(RM) myprog *.o *~
myprog: $(MY_OBJECTS)

使用make --trace或调试您的remake -xMakefile

如果你有多个 *.c源文件(即翻译单元)链接到同一个程序中,你应该有一个公共头文件myheader.h(共享所有公共函数和变量的公共声明),应该#include在每个源文件中 -ed。然后你需要依赖它:

 MY_HEADER= myheader.h
 %.o: %.c $(MY_HEADER)

请注意(有或没有任何)程序参数Makefile的顺序是非常重要的。看到这个gcc

于 2017-06-08T04:16:55.110 回答