当前位置: 首页 > news >正文

轻松搞定Makefile

编译:将源文件(.cpp)编译生成目标文件(.o)
gcc -c main.cpp -o main.o

链接:将目标文件(.o)生成可执行文件
gcc main.o -o main

合并:
gcc main.cpp -o main -lstdc++

-I 指定头文件目录
-L 指定库文件依赖路径
-l 指明库文件名

查看版本
make --version

Makefile
方式一:
target:
g++ -I. add.cpp sub.cpp main.cpp -o main

target:目标名称,可以随意命名
g++ 前面不是空格,必须是tab缩进
Makefile 里如果有多个目标,可以通过make加目标名称来执行指定的
目标,如果不是指定目标,则默认选择第一个目标执行
make target 也可以直接输入make

方式二:
target: main

main:g++ -I. add.cpp sub.cpp main.cpp -o main

注意:
"target: main"表示target目标依赖main目标
main为目标名称,可以随意命名

方式三:
target: add_o sub_o main_o main

main:g++ -I. add.o sub.o main.o -o mainadd_o:g++ -I. -c add.cpp -o add.osub_o:g++ -I. -c sub.cpp -o sub.omain_o:g++ -I. -c main.cpp -o main.o

注意:
依赖顺序,如果main 放前面存在找不到.o文件的错误

升级写法
模式规则
Makefile
target: add_o sub_o main_o main

main:g++ -I. add.o sub.o main.o -o main%.o: %.cppg++ -I. -c $< -o $@

说明:
%.o: %.cpp:所有的.o文件都由相同名称的.cpp文件编译生成
<:表示所有依赖的挨个值
@:表示所有目标的挨个值
这些奇怪的变量"<“、”@“我们叫"自动化变量”

变量替换
Makefile
OBJS = add_o sub_o main_o

target: ${OBJS} mainmain:g++ -I. ${OBJS} -o main%.o: %.cppg++ -I. -c $< -o $@clean:rm -rf ${OBJS} main

高级写法
文件过滤
Makefile

#找出当前目录下,所有的源文件(以.cpp结尾)
SRCS := ${shell find ./* -type f | grep '\.cpp'}
${warning SRCS is ${SRCS}}#确定cpp源文件对应的目标文件
OBJS := ${patsubst %.cpp, %.o, ${filter %.cpp, ${SRCS}}}
${warning OBJS is ${OBJS}}target: ${OBJS} mainmain:g++ -I. ${OBJS} -o main%.o: %.cppg++ -I. -c $< -o $@clean:rm -rf ${OBJS} main

编译选项
CFLAGS := -g -o2 -Wall -Werror -Wno-unused -ldl -std=c++11

静态库
./lib/libmul.a:${MUL_SRC:%.cpp=%.o}
ar rs $@ $^

动态库
./lib/libmul.so:${MUL_SRC:%.cpp=%.o}
gcc -I. -fPIC -shared -c $< -o $@

通过环境变量LD_LIBRARY_PATH来指定动态库查找目录
export LD_LIBRARY_PATH=./lib

CROSS =
#CROSS=/root/gcc-linaro-5.3.1-2016.05-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
CC = $(CROSS)gcc
CXX = $(CROSS)g++WORKDIR =/mnt/hgfs/Share/SOURCE/
#INSTALLPATH =/home/FCloudComm_jlx/
INSTALLPATH =/home/FCloudComm/
COMPILETYPE =26_
DDIRNAME =TRA_SHUILI_SDIDEBUG =
CXXFLAGS = $(DEBUG) -Wall -fPIC -shared -I. -I$(WORKDIR) -I$(WORKDIR)include -I$(WORKDIR)Source -L$(INSTALLPATH)bin -lDeliverDriverST -lServiceAPI -ldl -lpublicVERSION = 7.0.0.261
DRIVER = $(INSTALLPATH)delivers/$(DDIRNAME)/
TARGET = $(DRIVER)lib$(COMPILETYPE)$(DDIRNAME).so.${VERSION}DIRS = .
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
OBJS = $(patsubst %.cpp, %.o, $(FILES))OTHERFILES = ./sqlite3.c
OTHEROBJS = $(patsubst %.c, %.o, $(OTHERFILES))$(TARGET): $(OBJS) $(OTHEROBJS)$(CXX) $(OBJS) $(OTHEROBJS) $(CXXFLAGS) -o $@
#	cp -rf ../../xml/$(DDIRNAME).xml $(DRIVER)$(OBJS):%.o:%.cpp$(CXX) -c $< -o $@ $(CXXFLAGS)$(OTHEROBJS):%.o:%.c$(CC) -c $< -o $@ $(CXXFLAGS).PHONY: clean
clean:$(RM) $(TARGET)$(RM) $(OBJS)$(RM) $(OTHEROBJS)
http://www.lryc.cn/news/302520.html

相关文章:

  • 【C++之类和对象篇002】
  • k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(三)
  • 基于SSM的疫情期间学生信息管理平台的设计与实现(有报告)。Javaee项目。ssm项目。
  • LeetCode_20_简单_有效的括号
  • gRPC 备查
  • MySQL 基础知识(十)之 MySQL 架构
  • [晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型
  • Delphi v11 安卓权限申请
  • 频谱仿真平台HTZ Communications为私有5G建设铺平道路
  • 【高效开发工具系列】PyCharm使用
  • 进程终止与进程等待
  • MySQL 基础知识(六)之数据查询(二)
  • 蓝桥杯嵌入式STM32G431RBT6知识点(主观题部分)
  • ELAdmin 部署
  • 计算机功能简介:EC, NVMe, SCSI/ISCSI与块存储接口 RBD,NUMA
  • linux上安装bluesky的步骤
  • 视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?
  • django rest framework 学习笔记2
  • 第四篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:pyttsx3自动化脚本经典案例
  • model.train()和model.eval()两种模式的原理
  • docker的底层原理六: 联合文件系统(UnionFS)
  • 【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
  • 自养号测评低成本高效率推广,安全可控
  • ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module
  • 【elk查日志 elastic(kibana)】
  • RapidMiner数据挖掘2 —— 初识RapidMiner
  • 基于STM32的光照检测系统设计
  • 车辆管理系统设计与实践
  • 板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】
  • 漫谈:C/C++ char 和 unsigned char 的用途