为什么我不能使用makefile正确包含此文件?

时间:2016-01-06 00:31:04

标签: c++ makefile

我的目录结构如下所示:

root
  |____SG
  |     |
  |     |____Makefile
  |     |____simple_client_main.cpp
  |
  |___EEE
        |___my_utils.h

SG本质上是构建“simple_client”的操作基础,我从这里开始运行make。在simple_client_main.cpp我有以下#includes:

#include <iostream>
#include <string>

#include "my_utils.h"

所以我需要我的makefile才能知道my_utils.h的位置。考虑到这一点,我想将root / EEE目录添加为include目录。 (从我的位置开始,那将是....../ EEE。)

按照建议http://pastebin.com/wUA715QQ的建议,我的makefile如下所示:

DIR1 = ../EEE

CXXFLAGS = $(FLAG)

OBJS = simple_client_main.o
SRCS = simple_client_main.cpp

all: simple_client

simple_client: $(OBJS)
        g++ -o simple_client -I$(DIR1) $(OBJS) -lz

# [...]

depend:
        makedepend -- $(CFLAGS) -- $(SRCS)

但它不起作用:

simple_client_main.cpp:6:25: fatal error: my_utils.h: No such file or directory 
compilation terminated.

请注意,如果我在cpp中手动设置#include指令,如下所示:

#include "../EEE/my_utils.h"

......一切都按预期工作。

我可能在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

您需要将-I$(DIR1)添加到CFLAGSCXXFLAGS(或两者),以便在编译目标文件时,该选项存在于编译器命令行中。

您希望make执行类似于以下内容的操作:

g++ -c -I../EEE simple_client_main.cpp

如果您将-I../EEE添加到$(CXXFLAGS)$(CFLAGS),则应该这样做。您需要了解您正在使用的make程序使用的规则 - 它们可能会有所不同。

链接目标文件时,-I选项与相关性为时已晚(但您仍应在链接器命令行中包含$(CFLAGS)$(CXXFLAGS)作为其他选项,值得注意的是-g,在链接时以及编译到目标代码时都是相关的。)

以下是对问题中显示的大纲makefile的一些简单修改。

DIR1     = ../EEE
IFLAGS   = -I$(DIR1)
CXXFLAGS = $(FLAG) $(IFLAGS)
CFLAGS   = $(IFLAGS)
LDFLAGS  =
LDLIBS   = -lz
CXX      = g++

OBJS = simple_client_main.o
SRCS = simple_client_main.cpp

all: simple_client

simple_client: $(OBJS)
        $(CXX) -o $@ $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)

像这样的makefile可以正常工作。目前尚不清楚你可能会在FLAG宏中添加什么,所以我已经离开了它。 (我使用UFLAGSUXXFLAGS作为'用户定义的C(或C ++)标志';它们可以在命令行上设置,永远不会被makefile设置并包含在CFLAGSCXXFLAGS - 你可能会追求类似的东西。)

注意链接线几乎是所有宏。这是正常的,也是可取的;在不编辑make的情况下运行makefile时可以更改宏,但如果不编辑makefile,则无法更改常量文本。 C和C ++编译器的-c-o选项是关于所有应该以纯文本形式出现的选项。

如果仍有问题,请查看用于将C ++源代码编译为目标文件的内置规则,并相应地调整定义。 (你可以使用make -p来打印规则 - 你可能需要这些来查明发生了什么,但我希望不是因为它们往往很复杂。使用make -f /dev/null -p显示内置的仅限于规则;这也很有用。)

请注意,make depend规则可能需要进行一些手术。它使用$(CFLAGS)。如果$(CXXFLAGS)包含makedepend命令所需的额外选项,那么您可能需要这样做,甚至也可以。如果您只有C ++源代码,则可能只需要在命令行中使用$(CXXFLAGS)宏。

答案 1 :(得分:-1)

错误是来自编译阶段还是makedepend阶段?

因为我在上面看到的是,makedepend使用了JasperReport report = (JasperReport) JRLoader.loadObject(new File("jasperFolder/HibernateQueryDemoReport.jasper"); ,并且您没有将$(CFLAGS)放入-I$(DIR1)