2014-10-13 2 views
2

Мне нужно скомпилировать проект C++, который будет использовать внешние библиотеки и заголовки из проекта для линейного программирования COIN-OR. Он содержит два .cpp-файла. Основной файл, основной фермер, зависит от pm.h.Makefile не связывает необходимые .hpp-файлы

pm.h имеет все Включает lines main-farmer необходимо использовать для вызова функций COIN-OR. Это является код pm.h:

#include "ClpSimplex.hpp" 
#include "CoinHelperFunctions.hpp" 
#include "CoinTime.hpp" 
#include "CoinBuild.hpp" 
#include "CoinModel.hpp" 

У меня есть Makefile при условии, мой учитель и изменен, чтобы соответствовать моим потребностям, но всякий раз, когда я пытаюсь скомпилировать проект, запустив свой Makefile я получаю ту же ошибку :

In file included from main-farmer.cpp:5:0: pm.h:14:26: fatal error: ClpSimplex.hpp: No such file or directory compilation terminated. make: *** [main-farmer.o] Error 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 [email protected] $$bla $(ADDLIBS) $(LIBS) 

#### 
######## 
############ 
######## 
#### 


clean: 
    rm -rf $(CLEANFILES) 
.cpp.o: 
    $(CXX) $(CXXFLAGS) $(INCL) -c -o [email protected] `test -f '$<' || echo '$(SRCDIR)/'`$< 
.cpp.obj: 
    $(CXX) $(CXXFLAGS) $(INCL) -c -o [email protected] `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(SRCDIR)/$<'; fi` 
.c.o: 
    $(CC) $(CFLAGS) $(INCL) -c -o [email protected] `test -f '$<' || echo '$(SRCDIR)/'`$< 
.c.obj: 
    $(CC) $(CFLAGS) $(INCL) -c -o [email protected] `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(SRCDIR)/$<'; fi` 

Примечание: ClpSimplex.hpp живет в каталоге, указанном в COININCDIR.

+0

Где находится файл 'ClpSimplex.hpp'? Вы должны сообщить своему компилятору об этом пути (используя '-I' или подобное). –

+1

Это выглядит довольно неуклюжим 'для файла в $ (OBJS); do bla = "$$ bla \' $ (CYGPATH_W) $$ file \ '"; done; ':-P ... –

+1

@ πάνταῥεῖ Да, этот make-файл довольно ужасен. –

ответ

2

Ваш Makefile определяет COININCDIR, который, вероятно, указывает на родительский каталог ваших заголовков .hpp. Они должны быть найдены компилятором, и поскольку переменная не используется, это объясняет, почему они не найдены. Если вы добавите -I $ (COININCDIR) в CXXFLAGS, компилятор сможет их найти.

Смежные вопросы