Makefile模板以及多层Makefile编译(附源码)

Makefile编译目录下多个文件 今天终于学会了编写makefile,使之可以编译目录下所有c\cpp文件。 编译多个c文件一般有两个功能,一个是每个c文件都有main函数,就是说每个c文件的可执行文件是独立的,各自是各自的;第二个是多个c文件用来编译成一个可执行文件。 首先说第一个,内容如下,这个makefile是为了编译opencv代码的。 CFLAGS= -g -O3 `pkg-config opencv -- 阅读详情
AI摘要

本文详细介绍了如何使用Makefile编译Linux下的可执行程序、静态库和动态库,并讲解了多层Makefile在项目工程中的应用。内容涵盖Makefile的基本结构、编译选项、目标文件、库文件路径等关键要素,以及在多目录结构下的编译管理策略。示例中展示了Makefile模板的编写,包括编译器选择、宏定义、编译选项、链接步骤等,帮助读者掌握Makefile的编写技巧。

本文将介绍几个Makefile模板:编译可执行程序、编译静态库、编译动态库。以及简单地介绍在项目工程多目录下多层Makefile如何编译

关于Makefile的介绍,欢迎查阅之前发过的文章,认识Makefile以及基础知识 和 Linux库概念、静态库、动态库

1、前言

 现在很多IDE都集成了编译器,如Visual Studio等等,点击相关的编译按钮的一个操作即可完成编译、链接、生成目标文件。

 在Linux系统下,开发并编译程序一般用的gcc/g++编译器,如果是开发ARM架构环境下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。

 其实Linux下也可以实现“一键编译”功能,特别是在大工程项目下,此时需要借助Makefile,一个命令就完成编译、链接、生成目标文件就显得很有用处了。Makefile可以手动编写,也可以借助自动化构建工具(如scons、CMake、autotools等)生成。一般地一个通用的Makefile能够适合大部分Linux项目程序。

2、Makefile工程管理

 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
 在一个makefile中通常包含如下内容:

  需要由make工具创建的目标体(target),通常是目标文件或可执行文件;

  要创建的目标体所依赖的文件(dependency_file);

  创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头。

makefile格式

target: dependency_files
  <TAB>command      #该行必须以tab键开头

3、Makefile模板

3.1 使用Makefile编译可执行文件

PROJECT_ROOT_PATH = /home/yimning/MakefileTemplate
VERSION     = 1.0.0

CC   =  gcc
DEBUG   =  -DUSE_DEBUG
CFLAGS  =  -Wall
SOURCES   =  $(wildcard *.c)
INCLUDES   =  -I../../include
#LIB_NAMES  =-lfun_a -lfun_so	# 如果使用到相关库,可添加。若没有就注释该行。
LIB_NAMES  =  -lfoo -lbar      # 比如我这里分别使用了静态库libfoo.a.1.0.0和libbar.so.1.0.0(已放到了/lib下)
LIB_PATH  =  -L./lib		  #使用到库的路径,一般放于/lib或在/usr/lib目录下 
OBJ   =  $(patsubst %.c, %.o, $(SOURCES))
TARGET  =  app

#links
$(TARGET):$(OBJ)
	@mkdir -p output
	$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
	@rm -rf $(OBJ)
 
#compile
%.o: %.c
	$(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@

.PHONY:clean
clean:
	@echo "Remove linked and compiled files......"
	rm -rf $(OBJ) $(TARGET) output 

本文将使用到的项目目录如下图所示:

【要点说明】

(01)程序版本

开发调试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。如果不指定输出路径则会默认放到当前目录下。

VERSION     = 1.0.0
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)

(02)编译器选择

Linux下为gcc/g++;arm下为arm-linux-gcc;不同CPU厂商提供的定制交叉编译器名称可能不同,如使用“arm-linux-gnueabi-gcc”。

VERSION = 1.00
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
CC = gcc

(03)宏定义

开发过程中,特殊代码一般增加宏条件来选择是否编译,如调试打印输出代码。-D是标识,后面接着的是“宏”。

VERSION = 1.0.0
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
DEBUG = -DUSE_DEBUG

(04)编译选项

可以指定编译条件,如显示警告(-Wall),优化等级(-O)。

VERSION = 1.0.0
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
CFLAGS =  -Wall -O

(05)源文件

指定源文件目的路径(相对路径或者绝对路径),利用“wildcard”获取路径下所有依赖源文件。

VERSION = 1.0.0
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
SOURCES   =  $(wildcard *.c)

(06)头文件

包含依赖的头文件,包括源码文件和库文件的头文件。

VERSION = 1.0.0
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
INCLUDES   =  -I../../include

(07)库文件名称

指定库文件名称,库文件有固定格式,静态库为libxxx.a;动态库为libxxx.so,指定库文件名称只需写“xxx”部分,

#LIB_NAMES  =-lfun_a -lfun_so	# 如果使用到相关库,可添加。若没有就注释该行。
LIB_NAMES  =  -lfoo -lbar      # 比如我这里分别使用了静态库libfoo.a.1.0.0和libbar.so.1.0.0(默认已放到了/lib下)

(08)库文件路径

指定依赖库文件的存放路径。注意如果引用的是动态库,动态库也许拷贝到“/lib”或者“/usr/lib”目录下,执行应用程序时,系统默认在该文件下索引动态库。

LIB_PATH  =  -L./lib		  #使用到库的路径,一般放于/lib或在/usr/lib目录下 

(09)目标文件

调用“patsubst”将源文件(.c)编译为目标文件(.o)。

OBJ   =  $(patsubst %.c, %.o, $(SOURCES)) #符合模式[%.c]的单词替换成[%.o] 即将.c文件转为.o文件 

(10)执行文件

执行文件名称

TARGET  =  app

(11)编译

#compile
%.o: %.c
	$(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@

(12)链接

可创建一个“output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件(.o)。

#links
$(TARGET):$(OBJ)
	@mkdir -p output
	$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
	@rm -rf $(OBJ)

(13)清除编译信息

执行“make clean”清除编译产生的临时文件。

.PHONY:clean
clean:
	@echo "Remove linked and compiled files......"
	rm -rf $(OBJ) $(TARGET) output 

(14)使用与编译

在对应例程目录下,输入make即可把编译后的执行文件放到output目录下(注:本例程使用到静态库和动态库。)

然后执行可执行文件如下:

小结:上面已经大概介绍了使用Makefile编译可执行程序的通用模板。接下来将介绍如何使用Makefile编译静态库与动态库,以及简单地介绍在项目工程多目录下多层Makefile如何编译。

2.2 使用Makefile编译静态库

LIB_NAME = libfoo

PROJECT_ROOT_PATH = /home/yimning/MakefileTemplate
VERSION     = 1.0.0

CCSRCS	= $(wildcard *.c)
CCOBJS = $(patsubst %.c,%.o, $(CCSRCS))

CC = gcc
DEBUG   =-DUSE_DEBUG
CFLAGS  =-Wall
AR = ar
ARFLAGS = -rv
SOFLAGS = -fPIC -shared
INCPATH = -I$(PROJECT_ROOT_PATH)/include
LDFLAGS = -L.
LIB_NAMES =  

#links
ifdef TARGET_SO
	TARGET = $(LIB_NAME).$(VERSION).so
endif

ifdef TARGET_AR
	TARGET = $(LIB_NAME).$(VERSION).a
endif

ifdef TARGET_SO
$(TARGET): $(CCOBJS)
	$(CC) $(SOFLAGS) $^ -o $@ $(LDFLAGS) $(LIB_NAMES)
endif

ifdef TARGET_AR
$(TARGET):$(CCOBJS)
	$(AR) $(ARFLAGS) $@ $^
endif

#compile
$(CCOBJS): %.o: %.c
	$(CC) $(INCPATH) $(CFLAGS) -c $< -o $@
	
.PHONY: install
install:
	mkdir -p $(PROJECT_ROOT_PATH)/lib
	cp $(TARGET) $(PROJECT_ROOT_PATH)/lib
	
.PHONY: clean
clean:
	@echo "Remove linked and compiled files......"
	-rm -rf $(CCOBJS)
	-rm -rf $(TARGET)
	-rm -rf $(PROJECT_ROOT_PATH)/include/$(LIB_NAME)
	-rm -rf $(PROJECT_ROOT_PATH)/lib/$(TARGET)

【要点说明】

(1)基本格式与“使用Makefile编译可执行文件”大体一致。

(2)使用到“ar”命令将目标文件(.o)链接成静态库文件(.a)。静态库文件固定命名格式为:libxxx.a。以及自己定义的版本信息。

(3)使用了条件编译与链接。

#links
ifdef TARGET_AR
 TARGET = $(LIB_NAME).a.$(VERSION)
endif

ifdef TARGET_AR
$(TARGET):$(CCOBJS)
 $(AR) $(ARFLAGS) $@ $^
endif

(4)使用与编译

在对应例程目录下,输入“make TARGET_AR=1”命令即可在当前目录下编译生成静态库;输入“make TARGET_AR=1 clean”清空链接与编译生成的相关文件。(注:使用了条件编译)。如下图所示。

2.3 使用Makefile编译动态库

LIB_NAME = libbar

PROJECT_ROOT_PATH = /home/yimning/MakefileTemplate
VERSION     = 1.0.0

CCSRCS	= $(wildcard *.c)
CCOBJS = $(patsubst %.c,%.o, $(CCSRCS))

CC = gcc
DEBUG   =-DUSE_DEBUG
CFLAGS  =-Wall
AR = ar
ARFLAGS = -rv
SOFLAGS = -fPIC -shared
INCPATH = -I$(PROJECT_ROOT_PATH)/include
LDFLAGS = -L.
LIB_NAMES =  

#links
ifdef TARGET_SO
	TARGET = $(LIB_NAME).$(VERSION).so
endif

ifdef TARGET_AR
	TARGET = $(LIB_NAME).$(VERSION).a
endif

ifdef TARGET_SO
$(TARGET): $(CCOBJS)
	$(CC) $(SOFLAGS) $^ -o $@ $(LDFLAGS) $(LIB_NAMES)
endif

ifdef TARGET_AR
$(TARGET):$(CCOBJS)
	$(AR) $(ARFLAGS) $@ $^
endif

#compile
$(CCOBJS): %.o: %.c
	$(CC) $(INCPATH) $(CFLAGS) -c $< -o $@
	
.PHONY: install
install:
	mkdir -p $(PROJECT_ROOT_PATH)/lib
	cp $(TARGET) $(PROJECT_ROOT_PATH)/lib
	
.PHONY: clean
clean:
	@echo "Remove linked and compiled files......"
	-rm -rf $(CCOBJS)
	-rm -rf $(TARGET)
	-rm -rf $(PROJECT_ROOT_PATH)/include/$(LIB_NAME)
	-rm -rf $(PROJECT_ROOT_PATH)/lib/$(TARGET)

【要点说明】

(1)基本格式与“使用Makefile编译可执行文件”大体一致。

(2)编译选项和链接选项增加“-fPIC -shared ”选项。动态库文件固定命名格式为libxxx.so。以及自己定义的版本信息。

(3)使用了条件编译与链接。

#links
ifdef TARGET_SO
 TARGET = $(LIB_NAME).so.$(VERSION)
endif

ifdef TARGET_SO
$(TARGET): $(CCOBJS)
 $(CC) $(SOFLAGS) $^ -o $@ $(LDFLAGS) $(LIB_NAMES)
endif

(4)使用与编译

在对应例程目录下,输入“make TARGET_SO=1”命令即可在当前目录下编译生成动态库;输入“make TARGET_SO=1 clean”清空链接与编译生成的相关文件。(注:使用了条件编译)。如下图所示。

4、Makefile多目标多层次编译

本小节来简单地介绍在工程项目多目录下多层Makefile如何编译。多个Makefile文件编译,多目标编译,多层次编译。以该项目例程为例,标红色框的Makefile为一级Makefile(也称顶层Makefile),标蓝色框的Makefile为二级Makefile。实际开发中还可以有更多层级的Makefile对工程进行多目标编译与链接等等。这里就简单的举例子介绍。其目录树结构如下:

其中二级的Makefile在前文贴出来了。那么顶层的Makefile如何写?总的来说,写法有点类似于总分结构(或者说父子关系)。本例程的顶层Makefile如下:

PROJECT_ROOT_PATH=$(shell pwd)
VERSION  = 1.0.0

MFLAGS = "CFLAGS=-w"
DFLAGS = "CFLAGS=-w -g -fPIC -DDEBUG -DREENTRANT"

#如果想编译静态库 指定TARGET_AR=1即可	
all :
	cd $(PROJECT_ROOT_PATH)/src/bar && $(MAKE) $(DFLAGS) TARGET_SO=1 && $(MAKE) install TARGET_SO=1		
	cd $(PROJECT_ROOT_PATH)/src/foo && $(MAKE) $(DFLAGS) TARGET_AR=1 && $(MAKE) install TARGET_AR=1
	cd $(PROJECT_ROOT_PATH)/src/test && $(MAKE) $(DFLAGS) && $(MAKE) install 

.PHONY: clean
clean :
	@echo "Remove linked and compiled files......"
	cd $(PROJECT_ROOT_PATH)/src/bar && $(MAKE) clean TARGET_SO=1
	cd $(PROJECT_ROOT_PATH)/src/foo && $(MAKE) clean TARGET_AR=1
	cd $(PROJECT_ROOT_PATH)/src/test && $(MAKE) clean
	-rm -rf $(CCOBJS)
	-rm -rf $(TARGET)
	-rm -rf $(PROJECT_ROOT_PATH)/lib/$(TARGET)

#export出来的变量将被子make进程继承。 
export PROJECT_ROOT_PATH VERSION

注:makeFile中export的使用。export出来的变量将被子make进程继承。 如果在确定是需要这种方式去传输变量,那么可以在子Makefile中注释相关的变量(比如注释下文test/Makefile中的PROJECT_ROOT_PATH和VERSION)。(也就说顶层Makefile中export的变量在子Makefile中可使用生效(相当于export全局变量),当然在子Makefile中可以重复定义变量,只在局部生效(相当于局部变量))。

测试例程

使用Makefile多目标编译和多层次编译的方式测试整个例程,其中包含使用静态库与动态库来进行编译与链接等,最终生成可执行文件。

测试例程的bar.h、bar.c

#ifndef BAR_H
#define BAR_H
int bar(int x);
#endif
/*
 * @Author: Yimning 1148967988@qq.com
 * @Date: 2022-07-02 10:05:07
*/
#include "bar/bar.h"

int add(int x, int y) {
  return x + y;
}

测试例程的foo.h、foo.c

#ifndef FOO_H
#define FOO_H
int foo(int x);
#endif
/*
 * @Author: Yimning 1148967988@qq.com
 * @Date: 2022-07-02 10:20:07
*/
#include "foo/foo.h"
#include "bar/bar.h"

int foo(int x) {
     printf("foo use bar function---output:%d\n",add(33,66));
     return x+1;
}

测试例程的test/main.c

/*
 * @Author: Yimning 1148967988@qq.com
 * @Date: 2022-07-02 10:05:07
*/
#include <stdio.h>
#include "bar/bar.h"
#include "foo/foo.h"
int main(void) {
  printf("this is bar function---output:%d\n", add(44, 44));  // 88
  printf("this is foo function---output:%d\n", foo(add(33, 66)));  // 99
  return 0;
}

测试例程的test/Makefile

EXE_NAME = app
DEBUG = -D_MACRO #宏定义 

#PROJECT_ROOT_PATH = /home/yimning/MakefileTemplate
#VERSION     = 1.0.0

CC = gcc
DEBUG   =-DUSE_DEBUG
CFLAGS  =-Wall
CCSRCS	= $(wildcard *.c)			#获取所有的.c文件 
CCOBJS = $(patsubst %.c,%.o, $(CCSRCS))		#符合模式[%.c]的单词替换成[%.o] 即将.c文件转为.o文件 
INCPATH = -I../include -I$(PROJECT_ROOT_PATH)/include			#头文件路径 
LDFLAGS = -L$(PROJECT_ROOT_PATH)/lib			#库文件路径
LIB_NAMES = $(LIB_SO_OBJS)	$(LIBS_A_OBJS)		#链接库文件名字 

# 获取静态库名字
LIBS_A	= $(wildcard $(PROJECT_ROOT_PATH)/lib/*.a)   # 获取该目录下动态库(*.a)的路径名
LIBS_A_NOTDIR    = $(notdir $(LIBS_A))			# 去掉路路径,只留下文件名为libxxx.a
LIBS_A_NOTLIB    = $(subst lib,,$(LIBS_A_NOTDIR))	# 去掉文件名的lib,留下部分为xxx.a
LIBS_A_OBJS = $(patsubst %.a,-l%, $(LIBS_A_NOTLIB))		# 去掉文件名的后缀并在前面添加-l,留下部分为-lxxx

# 获取动态库名字
LIBS_SO	= $(wildcard $(PROJECT_ROOT_PATH)/lib/*.so)   # 获取该目录下动态库(*.so)的路径名
LIBS_SO_NOTDIR    = $(notdir $(LIBS_SO))			# 去掉路路径,只留下文件名为libxxx.so
LIBS_SO_NOTLIB    = $(subst lib,,$(LIBS_SO_NOTDIR))	# 去掉文件名的lib,留下部分为xxx.so
LIB_SO_OBJS = $(patsubst %.so,-l%, $(LIBS_SO_NOTLIB))		# 去掉文件名的后缀并在前面添加-l,留下部分为-lxxx

#links
$(EXE_NAME): $(CCOBJS)
	$(CC) $^ -o $@ $(LDFLAGS) $(LIB_NAMES)

#compile
$(CCOBJS): %.o: %.c
	$(CC) $(INCPATH) $(CFLAGS) -c $< -o $@
	
.PHONY: install
install:
	cp $(EXE_NAME) $(PROJECT_ROOT_PATH)
# 	make print						#调试打印变量

.PHONY: clean
clean:
	@echo "Remove linked and compiled files......"
	-rm -rf $(CCOBJS)
	-rm -rf $(EXE_NAME)
	-rm -rf $(PROJECT_ROOT_PATH)/$(EXE_NAME)

print:
	@echo $(LIBS_SO)
	@echo $(LIBS_SO_NOTDIR)
	@echo $(LIBS_SO_NOTLIB)
	@echo $(LIB_SO_OBJS)

使用与编译

在对应例程目录下,输入“make”命令即可在当前目录下编译生成可执行文件app.1.0.0;输入“make clean”清空链接与编译时生成的相关文件。(注:动态库已放到/lib/下)。如下图所示。


好了。本期的介绍到这里就结束了。感谢阅读与分享!搜索微信公众号:嵌入式IoT杂谈,回复"0728"即可获取本文例程。扫码关注我们世间万物,千奇百怪,都等待着你去发觉…

微信扫一扫关注该公众号

Makefile构建多级目录项目 1)MakeFile是什么 根据百度: MakeFile是一个文件。 MakeFile是一个文本文件。 Makefile是make工具执行自动化编译流程的依据文本文件。 就像编译一个可执行程序一样: xxx.c是一个文件。 xxx.c是一个文本文件。 xxx.c是gcc工具执行编译的依据文本文件。 xxx.c文件需要遵守C语言语法规则去编写;同样的,Makefile文件需要遵守Makefile语...... 阅读详情

相关推荐

使用 Makefile 编译多个文件

总结一下,Makefile 是一个强大的构建工具,通过编写合适的规则,可以自动化编译和链接多个源文件。如有疑问,请随时提问。Makefile 是一个常用的构建工具,它能够自动化编译和链接多个源文件,提高代码编译的效率。本文将为您介绍如何编写一个 Makefile 文件来编译多个文件。首先,我们需要创建一个名为 “Makefile” 的文件,并确保该文件与您的源代码文件在同一目录下。以上是一个简单的 Makefile 文件示例,其中包含了编译器的定义、编译选项的定义、目标文件的定义以及生成可执行文件的规则。

BUG?不存在的! 1731

从零开始写 Makefile

本文旨在介绍如何从零开始写Makfile,实现多文件、多目标、多级目录自动切换的代码编译。文中代码已全部测试通过,注释齐全。

Zhwers的博客 2519

【Linux + Makefile】简单实用的Makefile模板来了

今天给大家介绍一个简单实用的Makefile模板,也可以当做学习Makefile核心内容的范例,里面都有详细的注释,清晰明了。 这个Makefile主要解决以下需求: ###################################################################################### # 需求: #1.编译输出的所有文件均放在一个outp...

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 9万+

【Linux】一步一步教你编写单目录和多目录Makefile

本文将介绍Makefile的作用、优势、原理以及一步一步编写单目录和多目录Makefile

logani的博客 2910

内网CentOS离线部署LibreOffice:从依赖缺失到服务启动的完整避坑指南

本文详细介绍了在CentOS内网环境中离线部署LibreOffice的完整流程,包括依赖包准备、安装顺序优化及常见报错解决方案。针对金融等封闭网络场景,提供从rpm包选择到服务启动的全套避坑指南,特别解决libXinerama等图形库缺失问题,确保文档转换服务稳定运行。

weixin_33416697的博客 246

【Seurat绘图进阶】从参数调优到美学定制:解锁DimPlot与FeaturePlot的隐藏技巧

本文深入探讨了Seurat包中DimPlot与FeaturePlot的进阶使用技巧,旨在解决单细胞数据可视化中的常见痛点。通过参数调优(如order、shuffle、raster)、颜色美学定制(使用RColorBrewer、viridis配色)以及性能优化(栅格化处理),并结合scCustomize包与patchwork排版,帮助用户将基础图表提升为信息清晰、可直接用于论文发表的出版级可视化结果。

lake5的博客 630

一个STM32编译Makefile模板

最近突然对STM32感兴趣,研究了一下。STM32的编译方式非常多,由于一直对gcc情有独钟,所以还是喜欢使用Makefile+gcc编译的方法。当时从51单片机转向AVR单片机开发时,也是通过这种方式,那时已经使用Notepad++了,如今也一起在使用。 Makefile模板如下: # STM32F103 Makefile模板 # 参考来源: # https://github.com/andyt...

李迟的专栏 6678

域用户无法修改密码问题的解决方案

问题描述:加域的电脑无法更改密码,提示“无法更新密码,为新密码提供的值不符合字符域的长度、复杂度或历史要求”。 问题原因:域控制器中相关设置问题,主要如下图所示(如启用复杂性、最短期限和强制密码历史) 解决方案:在域控制器中更改对应的密码策略即可: ① 禁用复杂性要求 ② 最短使用期限改为0天 ③ 强制密码历史改为0 如果出现无法更改的情况,如下图箭头所指的图标所示 代表需要在域控制器的组策...

运维日记 3万+

Linux中内核模块的单独编译以及makefile的模板介绍

Linux内核模块在编译的时候可以通过命令编译: make -C 内核源码绝对路径 M=模块源码文件所在的绝对路径 modules 此命令的解释: 1)进入到内核源码目录 2)读取内核源码目录的Makefile 3)执行内核源码Makefile中的 modules 目标 4)根据 modules 目标的命令编译M所指向的文件路径 Makefile指定 的 C文件 如: ARM板的内核...

仗劍走天涯 4199

Leads、SDR、MQL、SQL、L2C术语概念,线索创建与清洗、线索分级模型、线索流转策略、线索的统计与分析

CRM中的“Leads”是什么?笔者在文中不仅较为全面地介绍了相关术语概念,还分析了线索的创建与清洗、线索的分级模型、线索流转策略以及线索的统计与分析。

盼盼学士 5960

SAP:QUERY中SQ02增加选择屏幕权限控制

【代码】SAP:QUERY中SQ02增加选择屏幕权限控制。

weixin_43734184的博客 2326

linux 源码编译 makefile,makefile模块编译模板

Makefile模板为:ifneq ($(KERNELRELEASE),)obj-m := memdev.oelseKDIR := /home/study/4-3-1/linux-2.6.29all:make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-clean:rm -f *.ko *.o *.mod.o *.mod...

weixin_33954881的博客 316

从入门到精通:3D视觉与SLAM实战全流程 mastery 教程

本文系统介绍了3D视觉与SLAM技术的应用前景、核心技术和实战路径。3D视觉通过RGB-D相机、激光雷达等传感器获取环境三维信息,SLAM技术实现自主定位与地图构建,二者结合广泛应用于自动驾驶、机器人导航等领域。文章详细拆解了点云处理、视觉里程计、回环检测等关键技术,并提供了ORB-SLAM2算法复现、语义SLAM开发的实战教程,涵盖硬件选型、环境配置到代码实现全流程。最后规划了从入门到专家的学习路径,推荐了相关书籍、开源项目和数据集资源,为读者掌握这一前沿技术提供了完整指南。

m0_71589036的博客 136

一个适用各类场合的Makefile模板

1.写在前面   对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发ARM下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。Linux下也可以实现“一键编译...

只要思想不滑坡,想法总比问题多。 5060

VSCode 中搭建 Python 开发环境

**验证安装**:打开终端(CMD/PowerShell/终端),输入 `python --version`(Windows)或 `python3 --version`(macOS/Linux),显示版本号即成功。- **下载地址**:[Python 官网](https://www.python.org/downloads/)(选择对应系统的最新稳定版,推荐 3.8+)- **调试**:通过 `launch.json` 配置,设置断点后按 `F5` 启动,使用 `F10/F11` 控制流程。

寒寒豆豆软件公司的博客 2540

Android面试必考问题:Android性能优化最全面试题及参考答案(8万字长文)

Android 中的 OOM(Out Of Memory,内存溢出)异常是指应用程序在运行过程中,由于申请的内存空间超过了系统所能提供的最大内存限制而导致的错误。在 Android 中,内存泄漏是指应用中的某些对象在不再被使用后,仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间,随着时间的推移可能会导致应用内存不足,甚至崩溃。在一次开发 Android 应用的过程中,我发现应用在长时间运行后会出现内存占用过高的情况,导致应用变得卡顿,甚至可能会被系统强制关闭。

大模型大数据攻城狮的专栏 2532

Makefile模板

1.写在前面   对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发ARM下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。Linux下也可以实现“一键编译”功能,此时需要一个编译脚本“Makefile”,Makefile可以手动编写,也可以借助自动化构建工具(如sc

weixin_38293850的博客 2194

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Makefile教程(附通用模板)

Makefile教程(附通用模板)

qq_36973838的博客 1509

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

几个Makefile通用模板分享!

原文:https://blog.youkuaiyun.com/qq_20553613/article/details/90649734大家好,我是ZhengN。本次给大家带来三个Makefile模板:...

嵌入式大杂烩 8470

Linux项目通用Makefile模板

Linux项目通用Makefile模板

lin 1168

Ubuntu下的Makefile模板汇总

人生中的第一篇博客,不知道如何开始,闲言碎语就不多说了,直奔我们的主题吧。  1.Makefile简介          windows开发人员对于makefile可能比较陌生,因为windows下开发应用几乎都是用的IDE(集成开发环境),内部集成编译器,所以程序员并不需要关心程序如何去编译的,只需知道点击哪里编译即可,其实IDE的编译器也是基于Makefile的,只不过不需要自己编写Mak

liuxiaoxiaocsdn的博客 1284

Linux内核模块LKM编译-自制Makefile模板

原文地址:Linux内核模块LKM编译-自制Makefile模板 作者:tekkamanninja      前段时间对内核的模块重新做了研究,对内核模块的编译流程也作了一定的了解,比起5年前有更深入的认识。     根据LDD3的内核模块makefile和原理说明,我根据自己的需要做了适当的修改使得这个Makefile脚本可以方便被应用于不同的简单模块编译,并可以在模块需要编

bugouyonggan的专栏 2148

通用Makefile模板与编译Linux的脚本

前言: 由于工作,编译应用层程序、编译动态库、编译静态库、编译Linux驱动模块,因此需要一个强大的Makefile的模板,只需要通过开关方便控制编译方向。 后面附带一个用于Linux源码下的内核配置(.config)、编译内核(zImage)、编译设备树(.dtb)、编译内核模块(.ko)、清除配置的Shell脚本。需要执行某个功能时,指定交叉编译器的命令不可注释(条件),取消注释可实现该功能的命令,其他行功能的命令继续注释。 1. 编译应用层程序的Makefile模板 2. 编译动态

weixin_42842270的博客 577

一种可自动实现增量编译的Makefile模板

Makefile介绍 程序的生成可分为预处理 编译 汇编 链接这几个阶段,各个阶段的功能不再赘述。对于平时写的各种小程序,并不需要很精细的管理。如果某一处发生了改动,直接把所有文件把的所有阶段全都执行一遍。当工程比较小的时候怎么做没有问题,但一旦工程比较大,就需要选择性的进行编译、链接等操作,否则会消耗很多时间。当源码有改动时,只对改动所能影响到的文件进行重构,这就是增量编译的概念。 Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些

qq_42731435的博客 1074

makefile 学习(5)完整的makefile模板

这里报错了,因为缺少了cuda的库文件,下面是查看自己cuda版本和找到在哪里的指令,以我的CUDA11.7为例, 去到目录下看看有什么库文件,我们当前需要一个cudaruntime的头文件。这里定义的名称参数 workspace 和 binary 是用来指定工作空间和生成的可执行文件名称的。在这个 Makefile 中,表示生成的可执行文件的名称。这些参数可以在 Makefile 中的其它规则中使用,例如在。表示的是工作空间的目录名称,来看看最后要完成的工程目录。

@bangbang的博客 652

Makefile文件之我的常用模板编译中小型项目

我最常用的Makefile文件模板 CC := arm-none-linux-gnueabi-g++ INC_DIR = -I./include -I./include/freetype2 -I./include/libpng -DTEST_DATA=1 SRC_DIR = ./src OBJ_DIR = ./object BIN_DIR = ./ SRC = $(wildcard

Ataraxia的专栏 799
上一篇: Ubuntu老是提示系统内存空间不足---扩展内存方法
下一篇: Linux字符设备驱动开发(一)
Yimning
博客等级 码龄8年 1万+粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值