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