Создайте 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
это очень важно. Смотрите это.