【问题标题】:Telling makefile to search different directory for C header file(s)告诉 makefile 在不同的目录中搜索 C 头文件
【发布时间】:2011-11-09 14:36:30
【问题描述】:

我已经尝试解决这个问题一段时间了,现在我已经没有猜测/想法了。

我正在为学校的数值分析课制作一些 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 使用了在 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 不存在(我已经仔细检查了路径并且它是正确的)。在 Bisection.c 中,我有

#include "CompareFloats.h"

像往常一样。我可以让它工作的唯一方法是让#include语句包含相对路径,比如

#include "../../../../util/CompareFloats/CompareFloats.h"

(它少了一个 ../,因为 Bisection.c 比 makefile 高一级)。

有什么建议吗?我真的很想只使用#include "CompareFloats.h" 而不是相对路径。

如果我没有提供足够的信息,请告诉我。

谢谢。

【问题讨论】:

  • 你能打印出实际运行的编译命令吗?如果你使用 make,它应该打印出像 gcc -ggdb ... 这样的行
  • cc -c -o ../Bisection.o ../Bisection.c ../Bisection.c:10:27:错误:CompareFloats.h:没有这样的文件或目录../ Bisection.c:在函数'bisect'中:../Bisection.c:32:错误:'EPSILON'未声明(在此函数中首次使用)../Bisection.c:32:错误:(仅报告每个未声明的标识符一次 ../Bisection.c:32: 错误:对于它出现的每个函数。) make: *** [../Bisection.o] 错误 1

标签: c search makefile directory header-files


【解决方案1】:

所以您的问题在于为Bisection.o 生成的自动规则。您可以执行以下两项操作之一:

1) 为Bisection.o 制定规则:

Bisection.o :       ../Bisection.h
        gcc -c -o ../Bisection.o -I$(UTIL) ../Bisection.c 

2) 将包含标志 -I$(UTIL) 附加到变量 CFLAGS(这些是传递给 C 编译器的标志)

【讨论】:

    【解决方案2】:

    开始于:

    CFLAGS=$(CFLAGS) -I$(UTIL)
    CXXFLAGS=$(CXXFLAGS) -I$(UTIL)
    

    大多数人最终也需要

    LDFLAGS=$(LDFLAGS) -I$(UTIL)
    

    但你还没有。

    【讨论】:

    • 对于 C++ 编译器来说不是 CXXFLAGS 吗? (问题要求 C 程序)
    • 谢谢大家。令人尴尬的是,我对 makefile 的了解非常有限。他们没有在学校明确地教我们细节,所以我一直在根据需要学习它,并在我的工作/实习中查看更“专业”的 makefile。我已经更新了所有相关的 makefile,一切都运行得很完美。
    • @Foo Bah:是的。我有两个都设置的习惯。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多