Создайте make-файл для кода cjson с -lcjson для парсера json в c

Я очень плохо знаком с make-файлами. Я компилирую файл кода c, который содержит библиотеку cJson из терминала, используя команду

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

заранее спасибо

1 ответ

Во-первых, не называйте свой исполняемый файл test так как это стандартное имя программы (по крайней мере, в POSIX).

Затем прочитайте документацию по GNU make. Он содержит учебный раздел.

Наконец, GNU make имеет несколько встроенных правил, которые вы можете получить с помощью make -p

Смотрите этот ответ для примера.

Я настоятельно рекомендую компилировать со всеми предупреждениями и отладочной информацией (то есть с gcc -Wall -Wextra -g если используется GCC). Так ставь CFLAGS+= -Wall -Wextra -g а также CC=gcc в вашем Makefile,

Чтобы связать с вашим -lcjson добавлять LIBES+= -lcjson в вашем Makefile, Помните, что символы табуляции важны в 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-x отладить ваш Makefile

Если у вас есть несколько *.c исходные файлы (то есть единицы перевода), связанные вместе в одной программе, у вас должен быть общий заголовочный файл myheader.h (чтобы поделиться общими объявлениями всех ваших открытых функций и переменных), которые должны быть #include -ed в каждом исходном файле. Тогда вам нужно зависеть от этого:

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

Обратите внимание, что (с или без Makefile) порядок аргументов программы для gcc это очень важно. Смотрите это.

Другие вопросы по тегам