告诉makefile在不同目录中搜索C头文件
我已经试着弄明白这一点有一段时间了,现在我已经到了一个不需要猜测/想法的地步 我正在为学校的一门数值分析课编写一些C程序,其中许多程序都使用了我事先编写的实用函数。我希望将实用程序“库”与类程序放在一个单独的目录中,但可以在需要时包含实用程序头文件。下面是我的“设置”(+=目录/文件夹,-=文件)的结构 基本上,我在目录二分法中有二分法.c和二分法.h。c使用位于util/CompareFloats目录下CompareFloats.h中的浮点比较函数 下面是我一直尝试使用的makefile:告诉makefile在不同目录中搜索C头文件,c,search,makefile,directory,header-files,C,Search,Makefile,Directory,Header Files,我已经试着弄明白这一点有一段时间了,现在我已经到了一个不需要猜测/想法的地步 我正在为学校的一门数值分析课编写一些C程序,其中许多程序都使用了我事先编写的实用函数。我希望将实用程序“库”与类程序放在一个单独的目录中,但可以在需要时包含实用程序头文件。下面是我的“设置”(+=目录/文件夹,-=文件)的结构 基本上,我在目录二分法中有二分法.c和二分法.h。c使用位于util/CompareFloats目录下CompareFloats.h中的浮点比较函数 下面是我一直尝试使用的makefile: #
###############################################################################
# makefile for Bisection test #
###############################################################################
#--------------------------------Macros----------------------------------------#
COMPILER = gcc
UTIL = ../../../../../util/CompareFloats
FLAGS = -ggdb -Wall -lm -I$(UTIL)
OBJECTS = ../Bisection.o ../BisectTest.o $(UTIL)/CompareFloats.o
OBJECT_DIR = ../OBJECTS
EXEC = BisectTest
all : $(EXEC)
test -d $(OBJECT_DIR) || mkdir $(OBJECT_DIR)
mv $(OBJECTS) $(OBJECT_DIR)
$(EXEC) : $(OBJECTS)
$(COMPILER) $(FLAGS) $(OBJECTS) -o $(EXEC)
#-----------------------------Dependencies--------------------------------------#
Bisection.o : ../Bisection.h
BisectTest.o: ../Bisection.h
CompareFloats.o: $(UTIL)/CompareFloats.h
clean:
rm -f $(EXEC) *.o $(OBJECT_DIR)/*.o
rmdir $(OBJECT_DIR)
我知道-I标志将允许在其他目录中搜索头文件。我想我是正确地使用了它,但我无法让它工作。我刚刚得到一个错误,CompareFloats.h不存在(我已经仔细检查了路径,它是正确的)。在二分法里面,我有
#include "CompareFloats.h"
像往常一样。我实现这一点的唯一方法是让#include语句包含相对路径,如
#include "../../../../util/CompareFloats/CompareFloats.h"
(它少了一个../因为Bisection.c比makefile高一级)
有什么建议吗?我真的希望只包含“CompareFloats.h”,而不是相对路径
如果我没有提供足够的信息,请让我知道
谢谢。所以您的问题在于为
二分法.o
生成的自动规则。您可以执行以下两种操作之一:
1) 为二分法制定规则。o
:
Bisection.o : ../Bisection.h
gcc -c -o ../Bisection.o -I$(UTIL) ../Bisection.c
2) 将include标志
-I$(UTIL)
附加到变量CFLAGS
(这些是传递给C编译器的标志),因此问题在于为二分法.o
生成的自动规则。您可以执行以下两种操作之一:
1) 为二分法制定规则。o
:
Bisection.o : ../Bisection.h
gcc -c -o ../Bisection.o -I$(UTIL) ../Bisection.c
2) 将include标志-I$(UTIL)
附加到变量CFLAGS
(这些是传递给C编译器的标志)从以下开始:
CFLAGS=$(CFLAGS) -I$(UTIL)
CXXFLAGS=$(CXXFLAGS) -I$(UTIL)
大多数人最终也需要帮助
LDFLAGS=$(LDFLAGS) -I$(UTIL)
但你还没有。从以下几点开始:
CFLAGS=$(CFLAGS) -I$(UTIL)
CXXFLAGS=$(CXXFLAGS) -I$(UTIL)
大多数人最终也需要帮助
LDFLAGS=$(LDFLAGS) -I$(UTIL)
但是您还没有。您能打印出实际运行的编译命令吗?如果您使用make,它应该打印出一行,如
gcc-ggdb…
cc-c-o../Bisection.o../Bisection.c../Bisection.c:10:27:error:CompareFloats.h:没有这样的文件或目录../Bisection.c:在函数“Bisection”中../Bisection.c:32:error:“EPSILON”未声明(首次在此函数中使用)../Bisection.c:32:error:(每个未声明的标识符只报告一次../Bisection.c:32:error:对于它出现在其中的每个函数。)make:**[../Bisection.o]错误1您可以打印出实际运行的编译命令吗?如果您使用make,它应该打印出一行,如gcc-ggdb…
cc-c-o../Bisection.o../Bisection.c../Bisection.c:10:27:Error:CompareFloats.h:没有这样的文件或目录../Bisection.c:在函数'Bisection':../Bisection.c:32:Error:'EPSILON'undecLARED(第一次使用此函数).. /BeSECT.C:32:错误:(每个未声明的标识符仅报告一次.. /BeSECT.C:32:错误:对于它出现的每个函数.):***./Bosio.O.1错误不是C++编译器的CXXFLAG(问题是C程序)谢谢大家。令人尴尬的是,我对makefiles的了解非常有限。他们在学校里没有明确地教给我们细节,所以我一直在学习,因为我需要它,并且通过看更专业的在我的工作/实习中,我已经更新了所有相关的MaX文件,所有的东西都运行得很好。@ Fo.Ba:是的。我有设置两者的习惯。C++编译器不是CXXFLAG(问题是C程序)吗?谢谢大家。令人尴尬的是,我对makefiles的了解非常有限。他们在学校里没有明确地教给我们细节,所以我一直在学习,因为我需要它,并且通过看更专业的在我的工作/实习中使用makefile。我已经更新了所有相关的makefile,一切都运行得很好。@Foo-Bah:是的。我习惯将两者都设置好。