搜索所有 .c 和 .cpp 文件并将它们编译到一个 makefile 中

     2023-02-17     225

关键词:

【中文标题】搜索所有 .c 和 .cpp 文件并将它们编译到一个 makefile 中【英文标题】:Search for all .c and .cpp files and compiling them in one makefile 【发布时间】:2020-02-20 22:48:37 【问题描述】:

我正在尝试创建一个 makefile,它将查找所有现有的 .c 和 .cpp 文件然后编译它们。

我以How to place object files in separate subdirectory 为模板,并将其与How to make a makefile for C and C++, with sources in subdirectories 结合使用。假设我已经定义了所有变量(我只是将它们排除在外,因为它们是不必要的)。

我不断收到的错误是make: *** No rule to make target 'obj/<randoCfile>.c', needed by '<target>'. Stop.

SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)
OBJECTS     := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.c=%.c.o))
OBJECTS     += $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.cpp=%.cpp.o))

#Default Make
all: $(TARGET)

#Remake
remake: cleaner all

#Make the Directories
directories:
    @mkdir -p $(TARGETDIR)
    @mkdir -p $(BUILDDIR)

#Clean only Objecst
clean:
    @$(RM) -rf $(BUILDDIR)

#Full Clean, Objects and Binaries
cleaner: clean
    @$(RM) -rf $(TARGETDIR)

#Link
$(TARGET): $(OBJECTS)
    $(CC) -o $(TARGETDIR)/$(TARGET) $^ $(LIB)

$(BUILDDIR)/%.c.o:
    $(CC) $(INC) $(CFLAGS) -c -o $@ $<

$(BUILDDIR)/%.cpp.o:
    $(CXX) $(INC) $(CXXFLAGS) -c -o $@ $<

#Non-File Targets
.PHONY: all remake clean cleaner resources

关于如何解决我的问题有什么建议吗? 我在 Windows 上运行(这就是为什么我使用通配符而不是我发现的一个示例中的 shell(find...)

【问题讨论】:

你不能。您必须列出要编译的每个源文件。 你不能按照你的要求去做,因为 make 文件不能使用通配符。花几分钟时间创建一个合适的 makefile - 你可能已经完成了它并在你创建这篇文章所花费的时间内工作。 查看您的规则,您似乎正在为每个源文件制作单独的可执行文件,而不是从所有源文件制作单个可执行文件。如果是这种情况,最简单的解决方案可能是删除 Makefile 并让 make 对所有内容使用默认规则。例如,rm Makefile; make $(basename *.c *.cc | sed 's/\..*$//') 之类的东西应该没问题。它不会将目标文件放在不同的目录中,但它很简单。使用默认规则;他们的存在是为了提供帮助。 真的不清楚你现在的情况。请清楚地说明您拥有哪些文件(以及当前的项目层次结构)以及您希望从这些文件中生成哪些文件。另外,说明你打算如何从命令行调用make 听起来cmake 更有可能更轻松地解决您的任务,您仍然需要生成一个源文件列表。您是否考虑过安装 cygwin 以便拥有像 find 这样的 linux 工具? 【参考方案1】:

你有几个问题。最重要的在这里:

SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)

假设这导致SOURCES 的值如下:

SOURCES := src/foo.c src/bar/bar.c src/biz/biz.cpp src/boz.cpp

现在OBJECTS 在以下之后会是什么?

OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.c=%.c.o))
OBJECTS += $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.cpp=%.cpp.o))

它将是(假设BUILDDIRobj):

OBJECTS := obj/foo.c.o obj/bar/bar.c.o obj/biz/biz.cpp obj/boz.cpp \
           obj/foo.c obj/bar/bar.c obj/biz/biz.cpp.o obj/boz.cpp.o

为什么?因为像$(SOURCES:%.c=%.c.o) 这样的翻译不会返回only 匹配模式的单词...它返回ALL 单词,然后翻译只有那些与模式匹配的。

由于您只是将.o 添加到后缀而不是替换后缀,因此您可以将其简化为:

SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)

OBJECTS := $(SOURCES:$(SRCDIR)/%=$(BUILDDIR)/%.o))

这个规则也不对:

$(BUILDDIR)/%.c.o:
        $(CC) $(INC) $(CFLAGS) -c -o $@ $<

这里您没有声明任何先决条件。也许你在没有向我们展示的其他地方这样做,但最好是这样:

$(BUILDDIR)/%.c.o: $(SRCDIR)/%.c
        $(CC) $(INC) $(CFLAGS) -c -o $@ $<

当然,.cpp 文件也是如此。

【讨论】:

感谢您采用这种类型进行教学,而不仅仅是批评。实现你在这里所做的和一些其他的小调整让 makefile 完成了我需要的工作!【参考方案2】:

Make(任何风格)是一个从目标(可执行文件)到源代码的程序,因此您通常从可执行文件(需要构建目标文件列表)开始,而这些对象取决于源代码它们依赖于构建的文件....您正在朝相反的方向思考...搜索源文件,然后朝相反的方向前进。虽然它更具动态性,但它不是 make 的工作方式,因此很可能该解决方案需要使用另一个程序来完成所有工作以编译每个源代码并最终以您可能无法指定的内容结束,并且 make 除了成为在那里执行您的搜索和编译程序。

出于这个原因,Make 的不同风格(例如 gnu make 或 berkely make)已经开发出每种不兼容的方法来尽可能地返回,使用 gnu make 中的函数,并在 berkeley 的情况下具有强大的宏功能制作。只是说这些都不是标准的,并且都需要一些培训才能有效地处理。

【讨论】:

gcc,g++

...译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已,比如,用gcc编译一个c文件的话,会有以下几个步骤:Step1:Callapreprocessor,likecpp.Step2:Callanactualcompiler,likeccorcc1.Step3:Callanassembler,li... 查看详情

Makefile 编译 c 和 cpp 文件

】Makefile编译c和cpp文件【英文标题】:Makefiletocompilebothcandcppfiles【发布时间】:2016-02-0314:03:07【问题描述】:我想编译我的程序,但这样做有一些问题。我的程序由一个用C编写的main函数组成。其他文件是我没有编写的.h或.cpp文... 查看详情

c++代码文件扩展名?.ccvs.cpp(代码片段)

...一方面,现代C++根本不使用扩展,我真的不喜欢它。我的所有项目都使用.h作为头文件,它们通过extern"C"和测试__cplusplus尽可能地支持C和C++。另一答案与大多数样式约定一样,只有两件事重要:尽可能保持一致使用。不要设计任... 查看详情

makefile模板1

 1,编译so#!/bin/bash##########################################################################################################################################################源文件,自动找所有.c和.cpp文件,并将目标 查看详情

关于一个多个.cpp文件的项目中,函数出现未定义引用错误

...?编译实际上是2个过程,编译和链接。编译过程只检查所有的符号(变量,函数)有没有声明,即只需要h文件生命就够了。但是链接时候,需要找到全部的函数的实现体,不把所有的.cpp一起编译,电脑怎么知道你还有文件呢,它... 查看详情

c_cpp静态变量,函数,引用和所有东西,它们表现得非常复杂。这个要点试图尝试这些概念(代码片段)

查看详情

用 gcc/g++ 编译器编译 c++

...】:我是C++新手,我想编译我的测试程序。我现在有3个文件"main.cpp""parse.cpp""parse.h"如何用一个命令编译它?【问题讨论】:【参考方案1】:同时编译它们并将结果放在a.out中$g++file.cppother.cpp同时编译它们并将结果放 查看详情

如何在 Linux 中编译 ISPC 代码并将其与普通 cpp 文件链接?

】如何在Linux中编译ISPC代码并将其与普通cpp文件链接?【英文标题】:HowcanIcompileISPCcodeinLinuxandlinkitwithnormalcppfile?【发布时间】:2021-04-1318:45:13【问题描述】:我想编译一个ispc程序。我正在尝试为他们的示例程序之一生成可执行... 查看详情

使用 SBT 编译测试并将它们打包以便稍后运行

...的管道中有一个提交阶段,我们发布到工件我们的二进制文件。二进制文件是使用dist任务生成的。然后管道运行用scala编写的冒烟和验收测试。它们使用sbt运行。我想做的是编译冒烟和验收测 查看详情

编译器找到头文件但没有找到 cpp 文件?

...录”中添加了一个文件夹,其中包含我的程序需要运行的所有其他.cpp和.h文件。编译器发现头文件很好,但是当我尝试构建项目时,我得到以下信息:1>Node.cpp1>c1xx:fatalerrorC1083:C 查看详情

在 makefile 中使用 ifeq 编译 C 或 CPP 文件

...间】:2018-08-1113:00:55【问题描述】:我想将src/目录下的所有文件编译成bc/%.bc。因为我使用了不能与.c文件一起使用的std=c++17标志,所以我尝试了这个:bc/%.bc:src/%.*ifeq\'$(suffix$^)\'\'.c\'emcc$^ 查看详情

Xcode 中的 Objective-C++ 和 .cpp 文件

...】:我正在尝试制作一个简单的Objective-C++应用程序。我所有的代码都编译得很好,包括在Objective-C类中使用C++,直到我尝试添加一个C++类。我创建了一个简单的C++类:测试.hclassTest;并将此文件包含在一个Obje 查看详情

如何搜索文件并将它们压缩到一个 zip 文件中

】如何搜索文件并将它们压缩到一个zip文件中【英文标题】:howcanisearchforfilesandziptheminonezipfile【发布时间】:2012-10-2510:49:03【问题描述】:我尝试使用以下命令搜索文件并压缩它们find.regexpression-execzip\\;但是它不起作用。我该怎... 查看详情

eclipse同时编译多个cpp文件(代码片段)

...C++Project选择MakefileProject中的EmptyProject.步骤2、添加测试源文件在helloworld工程上右键,新建文件夹src和Debug分别用来存放源文件和可执行文件(new->Folder)在src文件夹下分别新建hello.c和helloworld.cpp(new->fil 查看详情

eclipse同时编译多个cpp文件(代码片段)

...C++Project选择MakefileProject中的EmptyProject.步骤2、添加测试源文件在helloworld工程上右键,新建文件夹src和Debug分别用来存放源文件和可执行文件(new->Folder)在src文件夹下分别新建hello.c和helloworld.cpp(new->fil 查看详情

Eclipse 问题 - 编译期间不考虑在 .c 和 .cpp 文件中定义的预处理

】Eclipse问题-编译期间不考虑在.c和.cpp文件中定义的预处理【英文标题】:EclipseIssue-Preprocessdefinedin.c&.cppfilearenotconsideredduringcompilation【发布时间】:2017-06-2706:33:27【问题描述】:我正在使用Eclipse3.8,我正在开发具有不同配置... 查看详情

从文件中读取行并将它们分成两个数字并执行计算并将它们写入文件c ++

】从文件中读取行并将它们分成两个数字并执行计算并将它们写入文件c++【英文标题】:readlinesfromfileandsplitthemintotwonumbersandperformcalculationsandwritethemintofilec++【发布时间】:2015-10-1822:18:09【问题描述】:!!!!严格没有指针或数组!... 查看详情

在cmake的所有cpp文件中包含c ++标头[重复]

】在cmake的所有cpp文件中包含c++标头[重复]【英文标题】:Includec++headerinallcppfilesfromcmake[duplicate]【发布时间】:2017-11-1612:01:38【问题描述】:有什么方法可以在项目的所有cpp文件中包含标头(.hpp)(自动)?项目使用cmake编译。【... 查看详情