【问题标题】:include source files using path in makefile使用 makefile 中的路径包含源文件
【发布时间】:2014-08-01 09:43:07
【问题描述】:

我有一个名为 MAKE 的目录和两个子目录的源代码和标题。 source 包含 cpp 文件,header 包含一个包含在所有三个 cpp 文件中的头文件。 我正在尝试创建一个 make 文件。 我正在尝试从目录访问源文件和头文件。我的当前目录是 MAKE(我的 make 文件所在的位置)。

我收到错误,因为没有针对目标的规则。停止 我哪里错了

    CC = g++
    INC_SOURCE = -I/home/abhiskekkumar/Desktop/VINEETH/Make/source/
    INC_DEST =  -I/home/abhiskekkumar/Desktop/VINEETH/Make/header
    SOURCE = $(shell echo *.cpp)
    HEADER = $(shell echo *.h)
    OBJECT = $(SOURCE:.cpp=.o)
    TARGET = output

    EXEC: $(TARGET)
            ./output
    $(TARGET): $(OBJECT)
            $(CC) $(INC_SOURCE) $(INC_DEST) -o $(TARGET) $(OBJECT)

【问题讨论】:

  • 好吧,首先,期待$(shell echo *.cpp) 在 Make 目录中返回什么?它不会扫描子目录。处理这样的项目布局的推荐方法是使用 GNU Make 中的vpath 机制(我假设你正在使用)
  • 如果不清楚,$(OBJECT) 几乎肯定是空的,除非 Make 目录中有 cpp 文件。
  • 我没有使用 vpath。我是初学者。如果我不打算使用 vpath,我需要如何修改 SOURCE = $(shell echo *.cpp) & HEADER = $(shell echo *.h) ?你是对的。如果我的 cpp 文件在 make 目录中,我的 makefile 就会执行。
  • 你的源文件放在哪里?如果您不使用它,为什么需要HEADERINC_SOURCEINC_DEST 是什么意思?将标头从一个目录复制到另一个目录?.. 但是没有规则这样做。
  • Razor,您正在 Make 目录中执行 shell glob。如果该目录中没有 cpp 文件,则 $OBJECT 将为空。我正在尝试帮助您了解 Make,vpath 是一种更好的方法。如果你坚持自己的方式,那么要么查看find 命令的文档,它确实在子目录中查找,或者使用类似$(wildcard source/*.cpp) 之类的东西。阅读Make 手册一个小时将为你节省很多 /i> 痛苦,相信我!

标签: c++ makefile include-path


【解决方案1】:

第 1 步:我们编写一个什么都不做但能正确执行的 makefile。

nothing:
    @:

我们必须对此进行测试,并在继续之前让它完美运行。

第 2 步:我们生成一个源文件列表,并将其打印出来,以便我们知道它是正确的。

SOURCE = $(wildcard source/*.cpp)
$(info $(SOURCE))

nothing:
    @:

我们必须对此进行测试,并在继续之前让它完美运行。

第 3 步:我们决定要将目标文件放在哪里(例如 MAKE/MAKE/source/ 或其他地方)。

试试这个,发表评论并附上结果,然后我们会继续。

【讨论】:

  • @Razor:……那么第 3 步呢?你真的做了这些事情,还是在等待完整的解决方案?
  • 我一直到第 10 步或第 15 步才找到解决方案。我也确实在这里发布了我的解决方案。看看并分享您的 cmets。
  • 能否请您与我分享一些重要的网页,以便我可以从头开始研究 makefile 并继续进行一些高级的工作。谢谢...
  • STEP 1: nothing: @: Result-> Make: 无所事事。 STEP 2) 结果 ->source/a.cpp source/b.cpp source/c.cpp Make: 无所事事。第 3 步我没看懂。你能详细解释一下我应该怎么做吗?
【解决方案2】:
 CC = g++
 TARGET = vineeth

 CFLAGS   = -Wall

 LINKER   = g++ -o


SRCDIR   = source
HEADDIR  = header
OBJDIR   = obj
BINDIR   = bin

SOURCES  := $(wildcard $(SRCDIR)/*.cpp)
INCLUDES := $(wildcard $(HEADDIR)/*.h)
OBJECTS  := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)


$(BINDIR)/$(TARGET): $(OBJECTS)
     $(LINKER) $@ $(LFLAGS) $(OBJECTS)
     @echo "Linking complete!"

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
     @$(CC) $(CFLAGS) -c $< -o $@
     @echo "Compiled "$<" successfully!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2016-10-15
    相关资源
    最近更新 更多