首页 > 其他分享 >makefile相关

makefile相关

时间:2024-08-11 16:51:56浏览次数:8  
标签:文件 CMake makefile Makefile 源文件 编译器 构建 相关

1.makefile示例以及解析:

# 定义编译器和编译选项
CC=gcc
CFLAGS=-Wall -Wextra -pedantic -std=c99
LDFLAGS=-lm

# 定义项目目录和文件
SRCDIR=src
OBJDIR=obj
BINDIR=bin
INCDIR=include
LIBDIR=lib

# 查找源文件
SRCS=$(wildcard $(SRCDIR)/*.c)
OBJS=$(SRCS:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

# 定义目标可执行文件
TARGET=$(BINDIR)/myapp

# 编译和链接规则
all: $(TARGET)

$(OBJDIR)/%.o: $(SRCDIR)/%.c
    @mkdir -p $(@D)
    $(CC) $(CFLAGS) -I$(INCDIR) -c -o $@ $<

$(TARGET): $(OBJS)
    @mkdir -p $(@D)
    $(CC) $(OBJS) $(LDFLAGS) -o $@

# 清理规则
clean:
    rm -rf $(OBJDIR) $(BINDIR)

# 安装规则
install: $(TARGET)
    mkdir -p /usr/local/bin
    cp $(TARGET) /usr/local/bin/

# 卸载规则
uninstall:
    rm -f /usr/local/bin/$(notdir $(TARGET))

# 依赖库(假设)
LIB_NAME=mylib
LIB_SRC=$(wildcard $(LIBDIR)/*.c)
LIB_OBJ=$(LIB_SRC:$(LIBDIR)/%.c=$(OBJDIR)/lib/%.o)
$(OBJDIR)/lib/%.o: $(LIBDIR)/%.c
    @mkdir -p $(@D)
    $(CC) $(CFLAGS) -I$(INCDIR) -fPIC -c -o $@ $<

$(LIBDIR)/$(LIB_NAME).so: $(LIB_OBJ)
    $(CC) -shared -o $@ $^

# 链接库到可执行文件(如果需要)
$(TARGET): $(OBJS) $(LIBDIR)/$(LIB_NAME).so
    @mkdir -p $(@D)
    $(CC) $(OBJS) -L$(LIBDIR) -l$(LIB_NAME) $(LDFLAGS) -o $@

# 伪目标,用于构建库
.PHONY: lib
lib: $(LIBDIR)/$(LIB_NAME).so

# 测试目标(假设有测试文件)
test: $(TARGET)
    ./$(TARGET) -t

# 依赖关系检查(可选)
.PHONY: check-deps
check-deps:
    @echo "Checking dependencies..."
    # 这里可以添加依赖检查命令

# 打印变量值(调试用)
.PHONY: print-vars
print-vars:
    @echo "SRCS=$(SRCS)"
    @echo "OBJS=$(OBJS)"
    @echo "TARGET=$(TARGET)"

解析:

  1. 编译器和编译选项:定义了C编译器CC、编译选项CFLAGS和链接选项LDFLAGS

  2. 目录和文件:定义了源代码目录SRCDIR、对象文件目录OBJDIR、二进制文件目录BINDIR、头文件目录INCDIR和库文件目录LIBDIR

  3. 源文件和目标文件:使用wildcard函数查找所有.c源文件,并计算对应的.o对象文件路径。

  4. 编译和链接规则

    • 定义了如何从.c源文件生成.o对象文件的规则。
    • 定义了如何从对象文件生成最终的可执行文件$(TARGET)的规则。
  5. 清理规则:定义了clean目标,用于删除所有生成的对象文件和二进制文件。

  6. 安装和卸载规则:定义了如何将可执行文件安装到系统路径,以及如何从系统路径中卸载它。

  7. 依赖库

    • 定义了库文件的构建规则,包括如何从.c源文件生成.o对象文件,以及如何将对象文件链接成共享库文件。
    • 修改了可执行文件的链接规则,以包含新构建的库。
  8. 伪目标

    • lib伪目标用于构建库文件。
    • test伪目标用于运行测试(假设有测试文件)。
    • check-depsprint-vars伪目标用于依赖关系检查和打印变量值(调试用)。

2.makefile和cmake的区别:

1. 平台支持

  • CMake:是一个跨平台的构建工具,可以生成适用于多种操作系统和编译器的构建文件,如Makefile、Ninja构建文件、Visual Studio项目文件等。这使得CMake特别适合用于需要跨平台构建的项目。

  • Makefile:是一个基于文本的文件,它直接定义了构建过程的规则和命令。Makefile通常与GNU Make一起使用,但也需要针对不同的操作系统和编译器进行一定的设置或调整。

2. 依赖管理

  • CMake:能够自动管理源文件和库的依赖关系,从而简化构建过程。当源文件或依赖项发生变化时,CMake能够重新生成必要的构建文件,并确保按照正确的顺序进行构建。

  • Makefile:依赖关系需要手动管理。开发者需要在Makefile中明确指定每个目标文件所依赖的源文件或库,并在必要时更新这些依赖关系。

3. 配置文件

  • CMake:使用CMakeLists.txt文件来描述构建过程。这个文件包含了CMake命令和变量,用于定义项目名称、源文件列表、目标类型(如可执行文件或库)以及构建选项等。

  • Makefile:是一个简单的文本文件,包含了用于构建项目的规则和命令。Makefile的语法较为直接,但可能需要更多的手动配置和维护工作。

4. 可读性和维护性

  • CMake:通常被认为比Makefile更易于阅读和维护。CMakeLists.txt文件使用了更简洁的语法和更直观的结构,使得项目的构建过程更加清晰和可管理。

  • Makefile:虽然灵活且功能强大,但其语法相对复杂,且需要更多的手动配置。这可能会增加项目维护的难度和成本。

5. 执行效率

  • Makefile:由于它直接调用编译器进行编译,因此执行速度通常比CMake快。Makefile能够直接执行编译和链接等任务,而无需先生成中间文件。

  • CMake:需要先生成构建文件(如Makefile),然后再执行这些文件以完成编译过程。这个过程可能会比直接执行Makefile稍微慢一些,但CMake的跨平台特性和自动化依赖管理功能通常能够弥补这一不足。

6. 适用性

  • CMake:更适合大型项目和跨平台构建。CMake能够自动处理不同平台和编译器之间的差异,从而简化跨平台项目的构建过程。

  • Makefile:对于小型项目和单一平台构建来说,Makefile可能是一个更直接且高效的选择。Makefile的灵活性和直接性使得它能够在不需要复杂跨平台支持的情况下快速构建项目。

综上所述,CMake和Makefile各有其优势和适用场景。在选择构建工具时,应根据项目的具体需求和开发团队的偏好来进行决策。

标签:文件,CMake,makefile,Makefile,源文件,编译器,构建,相关
From: https://blog.csdn.net/yandong666/article/details/141107670

相关文章

  • 利用OpenCvSharp进行图像相关操作
    前言程序设计过程,有时也需要对图像进行一些简单操作,C#没有现成的图像处理库,但有人对OpenCV进行了包装,我们可以很方便的使用OpenCvSharp对图像进行操作。当然了,这也需要使用的人员进行一些研究,但相对于C++版本,它已经非常友好了。1、显示图像代码:privatevoidbutton1_Click(......
  • 集合:(ArrayList)的插值和去重,包含(Iterator和listIterator)迭代器相关使用
    总结:去重用for循环,插值可用for循环和迭代器(可以方便在中间插值),如果要修改集合,就用listIterator,防止父类的Iterator没有add添加功能,也避免版本号不一致报错去重:用contains方法,确认新集合中是否存在旧值1、基本数据类型String去重publicclassArrayListQuChong{public......
  • 4.makefile自动推导目标代码配置和伪目标clean清理
    4.makefile自动推导目标代码配置和伪目标clean清理4.1make和makefilemakefile文件主要包含了5部分内容:显式规则。说明了如何生成一个或多个目标文件。由makefile文件的创作者指出,包括要生成的文件、文件的依赖文件、生成的命令。隐式规则。由于make有自动推导的功能,所以隐......
  • .NET8 中空引用处理以及DDD相关概念
    作为一名.NET开发者,小白很开心看到.NET版本更新后,.NET语法越来越有意思,写起来也越来越有趣。很多新的语法,虽然变化不小,但是对小白这位从.NETFramework就开始写.NET的程序员来说,那也是信手拈来。但是小白发现string都开始变为可空的时候,那还是认真的翻阅了一下相关的资料,以免不......
  • 【Linux必备工具】自动化构建工具makefile的使用详解
    ✨                        听风八百遍,才知是人间    ......
  • 3.makefile运行流程分析并使用变量改写项目
    3.makefile运行流程分析并使用变量改写项目GNUmake用来构建和管理自己的工程Makefile文件描述了整个工程的编译、连接等规则3.1makefile变量的使用命令格式含义CXXC++编译器的名称,默认值为g++CXXFLAGSC++编译器的选项,无默认值$*不包含扩展名的目标文件......
  • 1.动手编写第一个makefile编译c++多文件项目
    1.动手编写第一个makefile编译c++多文件项目1.1ubuntu开发环境安装•apt-getupdate#更新安装源•apt-getinstallg++#安装gcc和c++的开发库•apt-getinstallgdb#调试工具•apt-getinstallmake•apt-getinstallopenssh-server#远程连接工具•apt-getin......
  • shell的相关知识(变量、脚本定义)
    一、shell的相关知识:1、对于shell编程语言大体分为:机器语言、汇编语言、高级语言2、shell变量类型:事先确定数据的存储格式和长度shell变量分为:字符型、数值型数值型又分为:整型、浮点型(在shell中一般不使用浮点型数值进行操作)3、shell:弱类型编程语言强:变量在使用前,必须事先......
  • OpenSSL相关命令(for Linux)详细介绍
    加密算法:对称加密算法:DES、IDEA、RC2、RC4、AES、Skipjack……非对称加密算法:RSA、DSA、DiffieHellman、PKCS、PGP……单向的HASH算法属于报文摘要算法,虽然有些也出自OpenSSL库。命令操作:1、生成普通私钥:[weigw@TESTsrc]$opensslgenrsa......
  • Vue3项目创建及相关配置
    Vue是一种用于构建用户界面的JavaScript框架。它采用了一种称为MVVM(Model-View-ViewModel)的架构模式。MVVM是一种将用户界面与业务逻辑和数据分离的设计模式。它包括三个部分:Model(模型):表示应用程序的数据和业务逻辑。在Vue中,模型通常是一个JavaScript对象。View(视图):表示......