c++ - 为简单的 src、include、libs 文件夹项目编写 Makefile

标签 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

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

最佳答案

您概述的目录结构没有很好地集成到您的 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++ 时,您可以即时生成包含 header 依赖信息的 .d 文件。这样,不需要单独的规则/构建步骤。只需确保在构建目标文件的规则之前 -include .depend

关于c++ - 为简单的 src、include、libs 文件夹项目编写 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50864108/

相关文章:

c++ - 游戏 vs 游戏引擎?

c++ - 降低 Unreal Engine 4.22 上 C++ 的时间复杂度

php - 在 MySQL 表中搜索文本字符串,如果找到则返回 [简单]

makefile - "$<"在 g++ 参数中使用时是什么意思?

c - 使用 Makefile 重新定义问题

c++ - C++ 中带有分和百分比的财务公式

c++ - 将 C DLL 的函数导入 C++ 程序

linux - 无法运行 ' Ant exec executable="zip"'

c++ - 如何将ls命令的输出获取到C++中的数组

c++ - 编译目标文件时出现 g++ 错误