2012-02-18 82 views
3

好吧,经过3个小时的研究,我即将精神错乱,所以我认为是时候将它传递给一些新的眼睛。Makefile不使用包含/库路径?

CXXFLAGS  = -g -Wall 
OBJS   = main.o 
PROG   = test 
INCLUDES  = -I /usr/include/mysql -I /usr/local/include 
LIBS   = -L /usr/lib/mysql -l libmysqlclient.so.15.0.0 -L /usr/local/lib -l libmysqlpp.so.3.1.0 

all:   $(PROG) 

${PROG}:  $(OBJS) 
      $(CXX) $(INCLUDES) -o $(PROG) $(OBJS) $(LIBS) 

clean:;   $(RM) -f $(PROG) core *.o 

有一些错误的include路径,因为我得到,当它显然不在/ usr/include中/ MySQL的存在mysql_version.h不存在错误。

检查第一部分出来的输出中的,它说

g++ -g -Wall -c -o main.o main.cpp 

这让我觉得我已经格式化的Makefile文件出了问题(由于额外的空间和缺乏包括/库路径) 。然而,我已经看了许多关于Makefiles和g ++选项的手册和文章,并且......没有进展。

我认为这应该是一个简单的修复。请帮助(你感觉到我的绝望吗?)。

另一方面,您是否认为特别指定库是必要的?我曾经在XCode中运行过这些东西,但我试图将代码迁移到我的Web服务器上...... Makefile已经停止了所有的进度,并且我认为这是我应该学习的东西。

+0

在我的Mac上正常工作。虽然它抱怨使用Tab而不是空格(这是特别关注的)。对不起没有更多的帮助:( – akhisp 2012-02-18 07:14:43

回答

10

在你的makefile中,你已经将你的include指令添加到了链接阶段,而不是编译阶段。

线条

${PROG}:  $(OBJS) 
      $(CXX) $(INCLUDES) -o $(PROG) $(OBJS) $(LIBS) 

说通过调用$ {CXX}编译器,使程序在$ {OBJS} $ {PROG}目标文件传递包含的文件夹(与其他参数一起)。相反,你的可变部分,这样做:

INCLUDES  = -I /usr/include/mysql -I /usr/local/include 
CXXFLAGS  = -g -Wall ${INCLUDES} 
OBJS   = main.o 
PROG   = test 
LIBS   = -L /usr/lib/mysql -l libmysqlclient.so.15.0.0 -L /usr/local/lib -l libmysqlpp.so.3.1.0 

这样你CXXFLAGS(它被用于编译阶段)现在应该领取您include指令。

+0

你是对的,我错过了那部分,当我尝试它。我只看链接阶段。好点。 – akhisp 2012-02-18 07:21:34

+0

我认为'-I'通常用于pre-编译器步骤,所以它会更好地适合'CPPFLAGS',但'CXXFLAGS'也很好。 – 2012-02-19 00:26:49