为简单的src编写Makefile,包含libs文件夹项目

时间:2018-06-14 18:52:23

标签: c++ linux makefile

我正在编写一个简单的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,但它给了我"没有输入文件"错误。 我正在使用一些第三方库,其中包含文件,其中包含子文件夹" include"文件夹中。

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

让我知道我做错了什么或更好的方式来编译这个项目。 感谢您对此事的任何帮助。

干杯,

1 个答案:

答案 0 :(得分: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