c++ - Makefile 未链接必要的 .hpp 文件

标签 c++ makefile

我需要编译一个 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 来编译项目时,我都会收到相同的错误:

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 $@ $$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 的目录中。

最佳答案

你的Makefile定义了COININCDIR,它可能指向你的.hpp头文件的父目录。这些需要由编译器找到,并且由于未使用该变量,这解释了为什么找不到它们。 如果将 -I$(COININCDIR) 添加到 CXXFLAGS,编译器将能够找到它们。

关于c++ - Makefile 未链接必要的 .hpp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347123/

相关文章:

c - 尝试在 makefile 中复制 2 个依赖项

c++ - 逆傅立叶变换FFT3W

c - "Undefined reference to main"与 main 在单独的脚本/规则中

c - Makefile, "nothing to be done for all"错误

c++ - 使用 <wincrypt.h> 加密解密期间丢失字符

c - makefile ("no input files"错误)

c++ - 与要定义的规则序列相关的 Makefile 行为

c++ - 指针和新运算符

c++ - 当模板成员函数有多个参数时,只传递第一个参数就足够了吗?

c++ - 如何使用编译器 g++-8.2 编译 Hazelcast C++ 客户端