Как объединить два файла создания?

#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} ). Вы должны, по крайней мере, знать, как работает ваша цепочка инструментов компилятора.