一段时间以来,我一直在尝试解决这个问题,但现在我已经没有任何猜测/想法了。
我正在为学校的数值分析课编写一些 C 程序,其中许多程序都使用了我事先编写的实用函数。我希望将实用程序“库”放在与类程序不同的目录中,但能够在需要时包含实用程序头文件。下面是我的“设置”的结构(+ = 目录/文件夹,- = 文件)
+Code
+Classes
+Fall_11
+Numerical_Programs
+Bisection
-.c and .h file(s) for bisection
+linux
-makefile
+util
+CompareFloats
- CompareFloats.h
基本上,我在 Bisection 目录中有 Bisection.c 和 Bisection.h。 Bisection.c 使用 CompareFloats.h 中的浮点比较函数,位于 util/CompareFloats 目录中。
下面是我一直在尝试使用的 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 不存在(我已经仔细检查了路径并且它是正确的)。在 Bisection.c 中,我有
#include "CompareFloats.h"
像往常一样。我能让它工作的唯一方法是让#include 语句包含相对路径,比如
#include "../../../../util/CompareFloats/CompareFloats.h"
(它少了一个 ../因为 Bisection.c 比 makefile 高一级)。
有什么建议吗?我真的很想用#include "CompareFloats.h"而不是相对路径。
如果我没有提供足够的信息,请告诉我。
谢谢。
最佳答案
所以您的问题出在为 Bisection.o
生成的自动规则中。您可以执行以下两项操作之一:
1) 为 Bisection.o
制定规则:
Bisection.o : ../Bisection.h
gcc -c -o ../Bisection.o -I$(UTIL) ../Bisection.c
2) 将包含标志 -I$(UTIL)
附加到变量 CFLAGS
(这些是传递给 C 编译器的标志)
关于c - 告诉 makefile 在不同的目录中搜索 C 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291173/