Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
告诉makefile在不同目录中搜索C头文件_C_Search_Makefile_Directory_Header Files - Fatal编程技术网

告诉makefile在不同目录中搜索C头文件

告诉makefile在不同目录中搜索C头文件,c,search,makefile,directory,header-files,C,Search,Makefile,Directory,Header Files,我已经试着弄明白这一点有一段时间了,现在我已经到了一个不需要猜测/想法的地步 我正在为学校的一门数值分析课编写一些C程序,其中许多程序都使用了我事先编写的实用函数。我希望将实用程序“库”与类程序放在一个单独的目录中,但可以在需要时包含实用程序头文件。下面是我的“设置”(+=目录/文件夹,-=文件)的结构 基本上,我在目录二分法中有二分法.c和二分法.h。c使用位于util/CompareFloats目录下CompareFloats.h中的浮点比较函数 下面是我一直尝试使用的makefile: #

我已经试着弄明白这一点有一段时间了,现在我已经到了一个不需要猜测/想法的地步

我正在为学校的一门数值分析课编写一些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:是的。我习惯将两者都设置好。