#c #unix #makefile
Вопрос:
Я не очень хорошо разбираюсь в файлах makefile, и у меня возникают некоторые проблемы с конфигурацией при объединении двух разных файлов makefile. У меня есть два каталога с разными проектами, составленных несколькими .c/.cpp файлы и один файл makefile для каждого проекта. Я хотел бы перенести файл1.c проекта A в проект B, очевидно, я не могу просто удалить файл, но я должен правильно изменить файл проекта B. СОЗДАЙТЕ файл проекта A:
DESTDIR ?=
PREFIX ?= /usr/local
MAKEFLAGS := -k
CFLAGS := -O2 -Wall -Wno-parentheses
CPPFLAGS =
-Iinclude
-DAF_CAN=PF_CAN
-DPF_CAN=29
-DSO_RXQ_OVFL=40
-DSCM_TIMESTAMPING_OPT_STATS=54
-D_FILE_OFFSET_BITS=64
-D_GNU_SOURCE
PROGRAMS_CANGW :=
cangw
PROGRAMS_ISOTP :=
isotpdump
isotpperf
isotprecv
isotpsend
isotpserver
isotpsniffer
isotptun
PROGRAMS_J1939 :=
j1939acd
j1939cat
j1939spy
j1939sr
testj1939
PROGRAMS_SLCAN :=
slcan_attach
slcand
PROGRAMS :=
$(PROGRAMS_CANGW)
$(PROGRAMS_ISOTP)
$(PROGRAMS_J1939)
$(PROGRAMS_SLCAN)
asc2log
bcmserver
can-calc-bit-timing
canbusload
candump
canfdtest
cangen
cansequence
canlogserver
canplayer
cansend
cansniffer
log2asc
log2long
mcp251xfd-dump
slcanpty
all: $(PROGRAMS)
clean:
rm -f $(PROGRAMS) *.o
install:
mkdir -p $(DESTDIR)$(PREFIX)/bin
cp -f $(PROGRAMS) $(DESTDIR)$(PREFIX)/bin
distclean:
rm -f $(PROGRAMS) $(LIBRARIES) *.o *~
asc2log.o: lib.h
canbusload.o: lib.h
candump.o: lib.h
cangen.o: lib.h
canlogserver.o: lib.h
canplayer.o: lib.h
cansend.o: lib.h
cansequence.o: lib.h
log2asc.o: lib.h
log2long.o: lib.h
j1939acd.o: libj1939.h
j1939cat.o: libj1939.h
j1939spy.o: libj1939.h
j1939sr.o: libj1939.h
testj1939.o: libj1939.h
canframelen.o: canframelen.h
asc2log: asc2log.o lib.o
candump: candump.o lib.o
cangen: cangen.o lib.o
canlogserver: canlogserver.o lib.o
canplayer: canplayer.o lib.o
cansend: cansend.o lib.o
cansequence: cansequence.o lib.o
log2asc: log2asc.o lib.o
log2long: log2long.o lib.o
j1939acd: j1939acd.o libj1939.o
j1939cat: j1939cat.o libj1939.o
j1939spy: j1939spy.o libj1939.o
j1939sr: j1939sr.o libj1939.o
testj1939: testj1939.o libj1939.o
canbusload: canbusload.o canframelen.o
mcp251xfd-dump: mcp251xfd/mcp251xfd-dev-coredump.o mcp251xfd/mcp251xfd-dump.o mcp251xfd/mcp251xfd-main.o mcp251xfd/mcp251xfd-regmap.o
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
Проект MAKEFILE B:
PROG = validNet
COMPILER = g
STD = c 17
FILES.CPP = GUI.cpp Pipe.cpp
CFLAGS = `pkg-config --cflags gtk -3.0`
LIBS = `pkg-config --libs gtk -3.0`
WARNING_FLAGS = -w
${PROG}: ${PROG}.cpp
time ${COMPILER} -std=${STD} ${WARNING_FLAGS} ${CFLAGS} ${PROG}.cpp ${FILES.CPP} -o ${PROG} ${LIBS}
clean:
rm ${PROG}
в частности, мне просто нужно использовать cangen.c в проекте B для университетского проекта.
Могу ли я просто поместить файл cangen.o в каталог проекта B и связать его как объектный файл? Это плохая практика?
Есть ли какой-нибудь простой способ объединить два файла makefile? Это выглядит просто, но я не нашел правильного решения, я пробовал с этим файлом makefile:
PROG = validNet
COMPILER = g -Wall -Wno-parentheses
STD = c 17
FILES.CPP = GUI.cpp Pipe.cpp cangen.c lib.c
CPPFLAGS =
-Iinclude
-DAF_CAN=PF_CAN
-DPF_CAN=29
-DSO_RXQ_OVFL=40
-DSCM_TIMESTAMPING_OPT_STATS=54
-D_FILE_OFFSET_BITS=64
-D_GNU_SOURCE
CFLAGS = `pkg-config --cflags gtk -3.0`
LIBS = `pkg-config --libs gtk -3.0`
WARNING_FLAGS = -w
${PROG}: ${PROG}.cpp
time ${COMPILER} -std=${STD} {$CPPFLAGS} ${WARNING_FLAGS} ${CFLAGS} ${PROG}.cpp ${FILES.CPP} -o ${PROG} ${LIBS}
clean:
rm ${PROG}
Редактировать:
Я решил эту проблему в конце, проблемы были не в файле Makefile, а в файле .cpp, я забыл включить некоторые библиотеки
Комментарии:
1. Как насчет создания 3-го файла makefile, который включает в себя только два других, обеспечивающих правильные контексты каталогов?
2. Я подумал о чем-то подобном, можно ли напрямую использовать объектный файл, созданный в результате компиляции исходного файла Makefile?
3. Вероятно, проще собрать объектные файлы в статически связанные библиотеки.
4. как я могу это сделать?
5. Использование
ar
(${AR}
). Вы должны, по крайней мере, знать, как работает ваша цепочка инструментов компилятора.