如何在生成文件中使用 g++ -MM

时间:2021-07-04 14:54:29

标签: c++ makefile

我可以在 g++ 中使用 -MM 选项以生成文件规则格式生成依赖项。

g++ -MM module2.cpp -I../src -I../../raven-set -I. -I../src/ext

输出

module2.o: module2.cpp pch.h ../src/theGlobalDefines.h \
 ../../raven-set/raven_sqlite.h ../src/ext/sqlite3.h Module2.h \
 cPelexMixerComponent.h cErrorHandler.h cTimedEvent.h cPelexConfig.h \
 ../src/sgp.h ../src/cCircularVector.h ../../raven-set/cTimerBusyLoop.h \
 ../src/channelIdentification.h ../src/cPacketData.h cRxTx.h \
 cOutputTransmitter.h cDelayStats.h cMCUSB202.h cPeakerServer.h cInput.h \
 ../src/cSequenceNumber.h cRxPelexWireless.h ../../raven-set/cRunCount.h \
 cPeakFilter.h cSPO2StateMachine.h wrs_cProcessed.h ../src/log.h \
 wrs/cRaw.h wrs/cPacket.h wrs/cCalibrate.h wrs/cStream.h \
 ../src/cPelexMixerConfig.h ../src/ext/json.h wrs/cSignalProcessor_wrs.h \
 cD1ZeroCross.h ../src/cVitals.h cUI.h cTimeProfiler.h \
 ../licenser/cLicence.h cSignalProcessor.h ../src/cPeakFilterSet.h \
 ../src/cPeakFinder.h cDataRange.h cDerivativeTemplate.h \
 cDerivativePeak.h cInputRecord.h cSGPOutput.h cSignalProcessorConfig.h \
 cHeartRate.h ../src/StatusDB.h cLogger.h cKeyBoardMonitor.h \
 wrs/cStartSequence.h ../src/Configure.h ../src/HistoryDB.h \
 ../../raven-set/cRunWatch.h version.h

现在我该怎么办?

有没有办法让 make 运行 g++ -MM 命令,然后使用生成的规则?

这是生成文件

#source file search paths
VPATH = wrs . ../src ../src/ext ../licenser

# compiler include search paths
INCS=-I../src -I../src/ext \
    -I. -I"C:\Users\Public\Documents\Measurement Computing\DAQ\C" \
    -I../../boost/boost1_72 

# libraries required by linker
LIBS=-lstdc++fs  -lws2_32 -lwsock32 \
    -L"C:\Users\Public\Documents\Measurement Computing\DAQ\C" \
    -lcbw64 -lIphlpapi \
    -L../../boost/boost1_72/lib \
                -lboost_thread-mgw82-mt-x64-1_72 \
            -lboost_system-mgw82-mt-x64-1_72 \
            -lboost_program_options-mgw82-mt-x64-1_72 \
            -lboost_filesystem-mgw82-mt-x64-1_72


# folder for .o files
ODIR=./obj

#  sources
_OBJ =      \
        cLicence.o  \
        sha1.o  \
        ChannelIdentification.o  \
        ChannelLabels.o  \
        Configure.o  \
        CubicSpline.o  \
        HistoryDB.o  \
        StatusDB.o  \
        cPacketData.o  \
        cPeakFilterSet.o  \
        cPeakFinder.o  \
        cPelexMixerConfig.o  \
        cVitals.o  \
        cRunWatch.o  \
        cSpline.o  \
        cTimerBusyLoop.o  \
        json.o  \
        raven_sqlite.o  \
        sqlite3.o \
        log.o  \
        cD1ZeroCross.o  \
        cDataRange.o  \
        cDelayStats.o  \
        cDerivativeTemplate.o  \
        cErrorHandler.o  \
        cHeartRate.o  \
        cInput.o  \
        cInputRecord.o  \
        cMCUSB202.o  \
        cOutputTransmitter.o  \
        cPacketAlpha.o  \
        cPacketWRS.o  \
        cPeakFilter.o  \
        cPeakFinderSustainedD1.o  \
        cPeakFinderTallPoppy.o  \
        cPeakerServer.o  \
        cPelexConfig.o  \
        cPelexMixerComponent.o  \
        cRxPelexWireless.o  \
        cRxTx.o  \
        cSGPOutput.o  \
        cSPO2StateMachine.o  \
        cSignalProcessor.o  \
        cTimeProfile.o  \
        cTimedEvent.o  \
        cUI.o  \
        module2.o  \
        sgp.o  \
        cCalibrate.o  \
        cRaw.o  \
        cSignalProcessor_wrs.o  \
        cStartSequence.o  \
        cStream.o  \
        wrs_cProcessed.o

OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/sqlite3.o: sqlite3.c
    gcc  -c -o $@ $<
$(ODIR)/%.o: %.cpp
    g++ -std=c++17 -m64 -fexceptions -D_mingw_ -DMODULE2 -O2 \
         -c -o $@ $< $(INCS)

mixer: $(OBJ) 
    g++ -m64 -O2 -s -o ../bin/PelexMixer.exe $^ $(LIBS)

1 个答案:

答案 0 :(得分:0)

我需要执行以下步骤来生成、存储和包含依赖文件

这遵循@G.M 提供的 link 中的提示以及添加到此答案中的有用评论

步骤 1: 定义一些请求生成和存储依赖项的标志。请注意,我将 .o 和 .d 文件都存储在同一个文件夹中 - 让事情变得更简单

# flags requesting dependency generation
DEPFLAGS = -MT $@ -MMD -MP -MF $(ODIR)/$*.d

第 2 步向编译规则添加标志,以便我们继续生成它们

$(ODIR)/%.o: %.cpp
    g++ -std=c++17 -m64 -fexceptions -D_mingw_ -DMODULE2 -O2 \
        $(DEPFLAGS) \
         -c -o $@ $< $(INCS)

步骤 3 包含依赖文件

    # convert list of object files to list of dependency files
    DEPFILES := $(_OBJ:%.o=$(ODIR)/%.d)

    # empty rule, so make won't complain
    # about not having a rule to make the dependency file if missing
    $(DEPFILES):

    # include the dependency files 

    include $(wildcard $(DEPFILES))

这是我的完整生成文件,其中包含上述更改

#source file search paths
VPATH = wrs . ../src ../src/ext ../licenser

# compiler include search paths
INCS=-I../src -I../src/ext \
    -I. -I"C:\Users\Public\Documents\Measurement Computing\DAQ\C" \
    -I../../boost/boost1_72 

# libraries required by linker
LIBS=-lstdc++fs  -lws2_32 -lwsock32 \
    -L"C:\Users\Public\Documents\Measurement Computing\DAQ\C" \
    -lcbw64 -lIphlpapi \
    -L../../boost/boost1_72/lib \
                -lboost_thread-mgw82-mt-x64-1_72 \
            -lboost_system-mgw82-mt-x64-1_72 \
            -lboost_program_options-mgw82-mt-x64-1_72 \
            -lboost_filesystem-mgw82-mt-x64-1_72


# folder for .o files and depedency files
ODIR = ../pelexmixer/obj

# flags requesting dependency generation
DEPFLAGS = -MT $@ -MMD -MP -MF $(ODIR)/$*.d

#  sources
_OBJ =      \
        cLicence.o  \
        sha1.o  \
        ChannelIdentification.o  \
        ChannelLabels.o  \
        Configure.o  \
        CubicSpline.o  \
        HistoryDB.o  \
        StatusDB.o  \
        cPacketData.o  \
        cPeakFilterSet.o  \
        cPeakFinder.o  \
        cPelexMixerConfig.o  \
        cVitals.o  \
        cRunWatch.o  \
        cSpline.o  \
        cTimerBusyLoop.o  \
        json.o  \
        raven_sqlite.o  \
        sqlite3.o \
        log.o  \
        cD1ZeroCross.o  \
        cDataRange.o  \
        cDelayStats.o  \
        cDerivativeTemplate.o  \
        cErrorHandler.o  \
        cHeartRate.o  \
        cInput.o  \
        cInputRecord.o  \
        cMCUSB202.o  \
        cOutputTransmitter.o  \
        cPacketAlpha.o  \
        cPacketWRS.o  \
        cPeakFilter.o  \
        cPeakFinderSustainedD1.o  \
        cPeakFinderTallPoppy.o  \
        cPeakerServer.o  \
        cPelexConfig.o  \
        cPelexMixerComponent.o  \
        cRxPelexWireless.o  \
        cRxTx.o  \
        cSGPOutput.o  \
        cSPO2StateMachine.o  \
        cSignalProcessor.o  \
        cTimeProfile.o  \
        cTimedEvent.o  \
        cUI.o  \
        module2.o  \
        sgp.o  \
        cCalibrate.o  \
        cRaw.o  \
        cSignalProcessor_wrs.o  \
        cStartSequence.o  \
        cStream.o  \
        wrs_cProcessed.o

OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

$(ODIR)/sqlite3.o: sqlite3.c
    gcc  -c -o $@ $<
$(ODIR)/%.o: %.cpp
    g++ -std=c++17 -m64 -fexceptions -D_mingw_ -DMODULE2 -O2 \
        $(DEPFLAGS) \
         -c -o $@ $< $(INCS)

mixer: $(OBJ) 
    g++ -m64 -O2 -s -o ../bin/PelexMixer.exe $^ $(LIBS)

DEPFILES := $(_OBJ:%.o=$(ODIR)/%.d)

$(DEPFILES):

include $(wildcard $(DEPFILES))
相关问题