更新Makefile以符合当今标准

时间:2014-10-27 13:01:51

标签: c++ makefile standards

我已经提供了以下Makefile。我应该编译一个有点复杂的项目,但Makefile本身并没有这样做,即使我试图修改它以使其工作。我正在研究GNU手册,但我的Makefile是用非常古老的风格编写的,我无法修复它。有人可以帮助我将其翻译成今天的标准,同时保持功能吗?

该行:

$(EXE):    $(OBJS)
        bla=;
        for file in $(OBJS); do bla="$$bla ` $$file`"; done; \
        $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $$bla $(ADDLIBS) $(LIBS)

是我主要感兴趣的那个。

这是完整的Makefile:

# //////////////// NOMBRE DEL PROYECTO /////////////////// 
    #
    P=project
    #

    EXE=$(P)
    OBJS=main.o model.o param.o head.h

    ADDLIBS=-D.
    ADDINCFLAGS=-I.

    SRCDIR=/root/projects/project

    ########## 


    CXX=g++

    CXXFLAGS=-O3 -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -I$(COININCDIR)
    CXXLINKFLAGS=-Wl,--rpath -Wl,/installed/CoinAll/lib



    CC=gcc

    CFLAGS=-03 -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wsequence-point -Wreturn-type -Wcast-qual -Wall


    COININCDIR=/installed/CoinAll/include/coin

    COINLIBDIR=/installed/CoinAll/lib


    LIBS=-L$(COINLIBDIR) -lCbc -lCgl -lOsiClp -lOsi -lClp -lCoinUtils -lm \
    `cat $(COINLIBDIR)/cgl_addlibs.txt` \
    `cat $(COINLIBDIR)/clp_addlibs.txt` \
    `cat $(COINLIBDIR)/coinutils_addlibs.txt` 

    # LIBS=-L$(COINLIBDIR) -lClp -lCoinUtils \
    # -lm `cat $(COINLIBDIR)/coinutils_addlibs.txt`

    INCL=-I`$(COININCDIR)`$(ADDINCFLAGS)



    all: $(EXE)

    .SUFFIXES: .cpp .c .o .obj

    $(EXE): $(OBJS)
        bla=;
        for file in $(OBJS); do bla="$$bla ` $$file`"; done; \
        $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $$bla $(ADDLIBS) $(LIBS)   


    .cpp.o:
        $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$<
    .cpp.obj:
        $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then  '$<'; else '$(SRCDIR)/$<'; fi`
    .c.o:
        $(CC) $(CFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$<
    .c.obj:
        $(CC) $(CFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then '$<'; else '$(SRCDIR)/$<'; fi`

1 个答案:

答案 0 :(得分:1)

第一个问题是`$(OBJS)中的条目是否打算为其输出运行,然后在链接行中使用它们的输出?

因为如果没有那么反引号是不正确的,可以删除整个循环并将该主体替换为:

$(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(ADDLIBS) $(LIBS)

鉴于$(OBJS)的值为main.o model.o param.o head.h(忽略了在对象列表中有.h文件这一事实很奇怪)我认为上述情况可能是正确的。

但是,为了完整性,让我们假设它不是,并且这些对象实际上希望执行输出。在这种情况下,身体可以被替换为:

$(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(patsubst %,`%`,$(OBJS)) $(ADDLIBS) $(LIBS)

最后两条评论。没有理由让里面反引号(假设它们首先是正确的)并且没有理由预先声明$bla=这样的内容。