【问题标题】:Writing Makefile for simple src, include, libs folders project为简单的 src、include、libs 文件夹项目编写 Makefile
【发布时间】:2018-11-24 14:55:59
【问题描述】:

我正在编写一个简单的 Makefile,它将遍历 ./src 文件夹中的 .cpp 文件并包含 ./include 文件夹中的文件。但出现“无输入文件”错误。你能帮我设置一下吗?

我有以下目录结构

./src     => It has main source file - Application.cpp and other applicationclass files like MyClass.cpp, Adapter.cpp. ...
./include => Include i.e. .h files, which has declarations.
./obj     => Where i am expecting to drop .o files
./bin     => Directory where i am expecting to drop executable

我尝试使用以下 Makefile,但它给了我“无输入文件”错误。 我正在使用一些第三方库,其中包含文件,这些文件是“包含”文件夹中的子文件夹。

appname := Application

CXX := g++
CXXFLAGS := -Wall -g

srcfiles := $(shell find . -maxdepth 1 -name "*.cpp")

objects  := $(patsubst %.cpp, %.o, $(srcfiles))

all: $(appname)
    $(appname): $(objects)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)

depend: .depend

.depend: $(srcfiles)
    rm -f ./.depend
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(objects)

dist-clean: clean
    rm -f *~ .depend

include .depend

让我知道我做错了什么或更好的方法来编译这个项目。 感谢您在此问题上提供的任何帮助。

【问题讨论】:

标签: c++ linux makefile


【解决方案1】:

您概述的目录结构没有很好地集成到您的makefile中。假设 makefile 在顶级目录中,该行

srcfiles := $(shell find . -maxdepth 1 -name "*.cpp")

由于-maxdepth 1,找不到任何文件。更好的方法是使用内置函数

srcfiles := $(wildcard src/*.cpp)

第二,

appname := Application

稍后作为 -o 参数传递给编译器。但是正如您所说,您希望二进制文件位于bin 目录中,这应该调整为bin/Application。最后,

all: $(appname)
    $(appname): $(objects)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)

没有很好的缩进。你想要这个:

all: $(appname)

$(appname): $(objects)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)

还要确保缩进是真正的制表符,而不是空格。附加说明:当将-MMD 传递给g++ 时,您可以即时生成包含头文件依赖信息的.d 文件。这样,不需要单独的规则/构建步骤。只需确保在构建目标文件的规则之前-include .depend

【讨论】:

  • 非常感谢。它现在试图编译 - 因为出现了一些错误:) 我添加了“includes”变量来传递包含文件路径并使用 -I$(includes) 参数传递它:$(appname): $(objects) $(CXX) $( CPPFLAGS) -I$(includes) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS) 是的,我的原始脚本中有“标签”。谢谢。
  • 这会使文件在 src 文件夹中创建 .o 文件。有没有一种简单的方法可以将它们移动到 obj 文件夹。
  • 您可以使用此转换:objecs = $(srcfiles:%.cpp=myBuildDirectory/%.o)。然后,依赖项规范必须是 myBuildDirectory/%.o: src/%.cpp 和该 $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ -c $< 的构建规则
  • 我为我的问题创建了单独的线程 - 因为无法在此处发布我修改后的 Makefile。线程描述为:在Makefile中添加INCLUDE、LIB和LD_LIBRARY_PATH
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2021-07-20
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多