基本思路:

最外层有三个文件: Makefile, Make.share, Make.include.

每个工程目录中都有一个Makefile文件.

其中最外层的Makefile是外壳部分.需要调用者修改里面的某些参数,例如编译平台,要编译的子目录集合,每个工程都要用到的头文件,编译参数等,设置完成后,会进入每个子目录,执行当前子目录中的Makefile文件.

Make.share和Make.include是供每个工程目中Makefile来包含的,里面包含标准Makefile机制所需要文件的代码.

工程目录下的Makefile : 设置每个工程自己的项目类型(可执行程序,静态库,动态库)和工程模块的名字,自己独特的头文件目录,编译、链接参数.在文件的开头包含最外层的Makefile.include,在文件结尾包含最外层的Makefile.share.

最外层的Makefile文件 :

##################################################################################################

##################################################################################################

# The target platform information.

# You can change the MACRO 'PLATFORM' or use make : make PLATFORM=[IOS, LINUX, MACOS]

# LINUX MACOS IOS

PLATFORM= LINUX

export PLATFORM

# SUB DIRS

SUBDIRS:= \

./hello/hellostaticlib \

./hello/hellodynamiclib \

./hello

# ROOT DIR

ROOTDIR:=$(shell pwd)

export ROOTDIR

# Global includes

GLOBAL_INCLUDES:=-I$(ROOTDIR)/hello/include

export GLOBAL_INCLUDES

# Global flags for compile

GLOBAL_CCXXFLAGS:= -g -DUNICODE -D_UNICODE

export GLOBAL_CCXXFLAGS

# Target path

TARGET_PATH:=$(ROOTDIR)/target

export TARGET_PATH

# IOS SDK Version

IOSSDK_V=5.0

export IOSSDK_V

#IOS CPU

IOS_ARCH= armv6 armv7 i386

export IOS_ARCH

##################################################################################################

##################################################################################################

SUPPORTCMDS:= all objs clean cleanall rebuild

export SUPPORTCMDS

.PHONY: SUPPORTCMDS ioscombine

$(SUPPORTCMDS):

ifeq ($(PLATFORM), IOS)

for subdir in$(SUBDIRS); do \

echo "Making " $$subdir; \

for arch in$(IOS_ARCH); do \

echo "For " $$arch; \

(cd $$subdir && make clean && make $@ ARCH=$$arch ); \

done; \

done;

else

for subdir in$(SUBDIRS); do \

echo "Making " $$subdir; \

(cd $$subdir && make $@); \

done;

endif

TS=$(notdir $(wildcard $(TARGET_PATH)/$(firstword $(IOS_ARCH))/*))

TSA=$(foreach arch, $(IOS_ARCH), $(foreach ts, $(TS), $(TARGET_PATH)/$(arch)/$(ts)))

ioscombine:

for ts in$(TS); do \

echo "Make " $$ts; \

echo$(TSA)| tr ' ' '\n'| grep $$ts | tr '\n' ' ' | xargs echo; \

echo$(TSA)| tr ' ' '\n'| grep $$ts | tr '\n' ' ' | xargs lipo -create-output$(TARGET_PATH)/$$ts; \

done;

最外层的Makefile文件需要修改的有这几个地方:

PLATFORM : 设置目标的平台. LINUX 代表通用linux系统; MACOS 代表mac系统; IOS 代表IPhone,IPad等IOS设备.

SUBDIRS : 设置工程包含的子模块,每个子模块目录下都有自己的Makefile文件.

GLOBAL_INCLUDES : 项目中各模块都会用到的头文件.

GLOBAL_CCXXFLAGS : 项目中各个模块都会用到的编译连接标志.

TARGET_PATH : 如果有必要,可以修改目标binarary的输出路径.

IOSSDK_V : 如果是IOS系统,需要设置编译IOS程序需要的SDK版本号.

IOS_ARCH : 如果是IOS系统,需要设置编译IOS程序需要支持的CPU类型.最后要调用build ioscombine来生成最终目标文件.

最外层的Make.include文件:

##################################################################################################

##################################################################################################

ifneq ($(ARCH), "")

TARGET_PATH_R:=$(TARGET_PATH)/$(ARCH)

endif

最外层的Make.include文件只是修正TARGET_PATH(即目标路径),如果设置了ARCH(CPU类型),依次把不同类型CPU的输入文件放入各自对应的目录中.只是对IOS类型有效.因此暂时IOS才会用到多CPU支持.

使用make命令编译C语言程序,c, c++用makefile编译工程 - 1相关推荐

  1. Linux GCC简明教程(使用GCC编译C语言程序)

    文章目录 Gedit 编辑器 GCC 编译器 1) 生成可执行程序 2) 运行可执行程序 完整的演示 分步骤编译 1) 编译(Compile) 2) 链接(Link) 市面上常见的 Linux 都是发 ...

  2. 怎样用gcc编译c语言,使用GCC编译C语言程序

    使用Eclipse CDT开发C语言程序,虽然使用很方便,效率也很高,但是它向我们隐藏了很多细节.虽然大多数时候这并不影响我们的开发,但是当我们需要对程序的编译链接过程进行更加特殊的控制,以获得可以满 ...

  3. gcc编译c语言多线程程序的步骤,GCC分步骤编译C语言程序

    上节<GCC编译C语言程序完整演示>讲解的是通过gcc命令一次性完成编译和链接的整个过程,这样最方便,大家在学习C语言的过程中一般都这么做.实际上,gcc命令也可以将编译和链接分开,每次只 ...

  4. centos linux编译c,紧急提醒!Linux是如何编译C语言程序文件的?CentOS 8的gcc使用方法介绍...

    一句话告诉你gcc怎么编译C文件 执行命令 gcc Tristone.c  -o Tristone 解释:"Tristone.C"Tristone可执行文件编译,编译完成后&quo ...

  5. printf如何消后续0_Hello World背后的故事:如何在Linux上编译C语言程序

    欢迎访问我的网站查看原文: https://lulaoshi.info/blog/2020/05/31/compile-c-hello-world-on-linux.html​lulaoshi.inf ...

  6. Ubuntu系统下C语言编译以及Makefile编译C语言程序

    目录 1.c语言hello world 1.打开终端 2.新建文件夹:mkdir 文件名 3.打开文件夹 cd 文件名 4.vim指令打开hello.c的c语言文件:vi hello.c 5.输入以下 ...

  7. linux中编译C语言程序

    1.首先安装gcc编辑器 yum install gcc* -y 2.编写C语言程序 [root@test ~]# vim aa.c #include<stdio.h> int main( ...

  8. c语言程序可以单独编译,c语言的函数能单独进行编译吗?

    c语言的函数能单独进行编译吗? 发布时间:2020-04-20 10:27:20 来源:亿速云 阅读:493 作者:小新 c语言的函数能单独进行编译吗?很多人都不太了解,今天小编为了让大家更加了解c语 ...

  9. Ubuntu18.04编译c语言程序

    在Ubuntu18.04系统下编译C程序的一般流程,vim文本编辑器的使用,makefile的使用等 一.vim教程 1. 功能 2. 模式 3. 基本操作 二.在Ubuntu系统下使用gcc编译c程 ...

最新文章

  1. Lowest Common Ancestor of a Binary Search Tree(树中两个结点的最低公共祖先)
  2. PHP 连接 Rabbitmq 实例代码(亲测通过)
  3. C-C Primer Plus阅读笔记
  4. 并查集:P1196 [NOI2002] 银河英雄传说
  5. tomcat 6.0环境, 网页超链接,文件下载另存为时,不能识别msi文件类型,另存为只能选htm和所有文件。...
  6. Luogu2014选课
  7. MySQL CONCAT函数:字符串拼接
  8. Android创建启动画面
  9. Python 做自动化测试环境搭建
  10. Xml解析作业与Xml建模andXml建模作业
  11. 如何把map的value转为list_如何在Java中将Map转换为List?
  12. python语言后缀_在Python语言中,可以作为源文件后缀名的是
  13. 常用adb命令 主要针对车机硬件类用的多
  14. 银联支付、支付宝支付和微信支付有什么优势?
  15. 三国志战略版:今天你打铁了吗?货布商店大解析
  16. 接力队选拔matlab,这是我见过的操作最好的接力队之一= =
  17. vue如何返回上一页效果
  18. 复制一个维基百科!—— 维基技术梳理
  19. Xilinx芯片存储介绍
  20. 新型知识管理工具-Baklib,比起语雀我更喜欢它

热门文章

  1. 20X42 FCPX插件专业强大电影级多功能调色插件 Cinema Grade Pro v1.1.3
  2. 前端根据不同的值赋予渐变色
  3. 第4关:求sinx近似值
  4. 用python庆祝生日_吃重庆小面 庆祖国华诞丨我们用重庆特色,为祖国母亲送上祝福...
  5. RTL8139 网卡驱动加载
  6. 镇江首批35名援湖北医疗队员平安归来
  7. Kafka的结构、特点和原理(细节)
  8. 关于深度学习的一些基础概念的简单梳理
  9. 在c语言程序中播放音乐,在C语言控制台程序中播放MP3音乐
  10. 读书笔记-3--人月神话(Mythical Man-Month)