编写简单的src、include、libs文件夹项目的Makefile

3
我正在编写一个简单的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

请告诉我我做错了什么或者有更好的方式来编译这个项目。 感谢您在此事上提供的任何帮助。


https://dev59.com/oanka4cB1Zd3GeqPIA4-#48793058 - Maxim Egorushkin
https://dev59.com/OlrUa4cB1Zd3GeqPj3Af#7321954 - Maxim Egorushkin
这里有几个可供您参考的工作示例。 - Maxim Egorushkin
请查看此处的Makefile,它涵盖了典型情况。它是为Fortran设计的,但可以轻松转换为基于C的项目:http://www.owsiak.org/fortran-and-gnu-make/ - Oo.oO
1个回答

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)

并且确保缩进是真正的制表符,而不是空格。另外需要注意的是:当传递-MMDg++时,您可以动态生成包含头文件依赖信息的.d文件。这样,就不需要单独的规则/构建步骤。只需确保在构建对象文件的规则之前-include .depend即可。

非常感谢。现在正在尝试编译——出了一些错误 :) 我添加了“includes”变量来传递包含文件的路径,并使用-I$(includes)参数进行传递:$(appname): $(objects) $(CXX) $(CPPFLAGS) -I$(includes) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)是的,我的原始脚本中有“制表符”。谢谢。 - Sat
这个 makefile 会在 src 文件夹内创建 .o 文件。有没有一种简单的方法将它们移动到 obj 文件夹中? - Sat
你可以使用以下转换:objecs = $(srcfiles:%.cpp=myBuildDirectory/%.o)。然后,依赖项规范必须是 myBuildDirectory/%.o: src/%.cpp,并且该规则的构建方式为 $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ -c $< - lubgr
我为我的问题创建了一个单独的线程 - 因为无法在此处发布我的修改后的Makefile。线程描述如下: 在Makefile中添加INCLUDE、LIB和LD_LIBRARY_PATH - Sat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接