提供了以下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`

最佳答案

第一个问题是$$(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=

关于c++ - 更新Makefile以符合当今的标准,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26588181/

10-11 23:09
查看更多