簡體   English   中英

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

[英]How to use g++ -MM in a 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)

我需要執行以下步驟來生成、存儲和包含依賴文件

這遵循@GM 提供的鏈接中的提示以及添加到此答案的有用評論

步驟 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM