我的目录结构如下所示:
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"
......一切都按预期工作。
我可能在这里做错了什么?
答案 0 :(得分:0)
您需要将-I$(DIR1)
添加到CFLAGS
或CXXFLAGS
(或两者),以便在编译目标文件时,该选项存在于编译器命令行中。
您希望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
宏中添加什么,所以我已经离开了它。 (我使用UFLAGS
和UXXFLAGS
作为'用户定义的C(或C ++)标志';它们可以在命令行上设置,永远不会被makefile
设置并包含在CFLAGS
或CXXFLAGS
- 你可能会追求类似的东西。)
注意链接线几乎是所有宏。这是正常的,也是可取的;在不编辑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)
。