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

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

gcc -test1.c -o test -lcjson 

с -lcjson наконец и его работает отлично. Но как скомпилировать один и тот же код с помощью make-файла, поскольку я должен добавить -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

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

Во-первых, избегайте присвоения имени исполняемому 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 в каждом исходном файле. Тогда вам нужно зависеть от него:

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

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