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