【发布时间】:2014-10-13 19:05:58
【问题描述】:
我需要编译一个 C++ 项目,该项目将使用项目中的外部库和头文件进行线性编程 COIN-OR。它包含两个 .cpp 文件。主文件 main-farmer 依赖于 pm.h。
pm.h 包含 main-farmer 调用 COIN-OR 函数所需的所有 include 行。这是pm.h的代码:
#include "ClpSimplex.hpp"
#include "CoinHelperFunctions.hpp"
#include "CoinTime.hpp"
#include "CoinBuild.hpp"
#include "CoinModel.hpp"
我有一个我的老师提供的 makefile,并根据我自己的需要进行了修改,但是每当我尝试通过运行我的 Makefile 来编译项目时,我都会遇到同样的错误:
在 main-farmer.cpp:5:0: pm.h:14:26 包含的文件中:致命错误: ClpSimplex.hpp:没有此类文件或目录编译终止。 make: *** [main-farmer.o] 错误 1
这是 Makefile:
#
P=farmer
#
EXE=$(P)
OBJS=main-farmer.o model-farmer.o param-farmer.o pm.h
ADDLIBS=-D.
ADDINCFLAGS=-I.
SRCDIR=~/coin-projects
##########
CXX=g++
CXXFLAGS=-O3 -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion
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
# COIN-OR libs
COINLIBDIR=/installed/CoinAll/lib
# Clp
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`
CLEANFILES=\
addBits.o addBits \
addColumns.o addColumns \
addRows.o addRows \
decompose.o decompose \
defaults.o defaults \
driver2.o driver2 \
driver.o driver \
driverC.o driverC \
dualCuts.o dualCuts \
ekk.o ekk \
ekk_interface.o ekk_interface \
hello.o hello \
makeDual.o makeDual \
minimum.o minimum \
network.o network \
piece.o piece \
rowColumn.o rowColumn \
sprint2.o sprint2 \
sprint.o sprint \
testBarrier.o testBarrier \
testBasis.o testBasis \
testGub2.o testGub2 \
testGub.o testGub \
testQP.o testQP \
useVolume.o useVolume
# Part 3
#
all: $(EXE)
.SUFFIXES: .cpp .c .o .obj
$(EXE): $(OBJS)
bla=;
for file in $(OBJS); do bla="$$bla `$(CYGPATH_W) $$file`"; done; \
$(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $$bla $(ADDLIBS) $(LIBS)
####
########
############
########
####
clean:
rm -rf $(CLEANFILES)
.cpp.o:
$(CXX) $(CXXFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$<
.cpp.obj:
$(CXX) $(CXXFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(SRCDIR)/$<'; fi`
.c.o:
$(CC) $(CFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$<
.c.obj:
$(CC) $(CFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(SRCDIR)/$<'; fi`
注意:ClpSimplex.hpp 位于指定为 COININCDIR 的目录中。
【问题讨论】:
-
ClpSimplex.hpp文件在哪里?您需要告诉您的编译器该路径(使用-I或类似的)。 -
这看起来很笨拙
for file in $(OBJS); do bla="$$bla `$(CYGPATH_W) $$file`"; done;:-P ... -
@πάνταῥεῖ 是的,这个 makefile 相当糟糕。
-
.cpp.o:类型规则有点陈旧。如果您使用的是 Gnu-make,那么您应该使用%o: %cpp,它更强大且更易于使用。 -
抱歉,我忘了编辑我的帖子说 ClpSimplex.hpp 位于指定为 COININCDIR 的目录中。