单一程序

准备一个hello.c

#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
}

gcc hello.c,执行文件名被自动设置成a.out,可用./a.out直接执行,因为这是编译成功的可执行二进制程序

gcc -c hello.c产生目标文件hello.o

gcc -o hello hello.o利用目标文件制作一个名为hello的执行文件

主、子程序链接

准备一个主程序thanks.c,一个子程序thanks_2.c

//thanks.c
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
thanks_2();
}
//thanks_2.c
#include <stdio.h>
void thanks_2(void)
{
printf("Thank you!\n");
}

进行编译与链接

gcc -c thanks.c thanks_2.c制作出两个.o文件

gcc -o thank thanks.o thanks_2.o产生thanks可执行程序

如果以后更新了thanks_2.c文件,只需要重新编译来产生新的thanks_2.o,然后再链接制作出最后的程序即可,不用再编译thanks.c

调用外部函数库

//sin.c
#include <stdio.h>
#include <math.h>
int main(void)
{
float value;
value = sin (3.14 / 2);
printf("%f\n", value);
}

数学函数库使用的是libm.so这个函数库,最好在编译的时候将它包含进去

gcc sin.c -lm -L/lib -L/lib64

-l: 是加入某个函数库的意思

m: 是libm.so这个函数库

由于Linux默认将函数库放置在lib和lib64中,所以不写也没关系

用make进行宏编译

准备4个文件main.c, haha.c, sin_value.c, cos_value.c

//main.c
#include <stdio.h>
#define pi 3.14159
char name[15];
float angle; int main(void)
{
printf ("\n\nPlease input your name: ");
scanf ("%s", &name );
printf ("\nPlease enter the degree angle (ex> 90): " );
scanf ("%f", &angle );
haha( name );
sin_value( angle );
cos_value( angle );
}
//haha.c
#include <stdio.h>
int haha(char name[15])
{
printf ("\n\nHi, Dear %s, nice to meet you.", name);
}
//sin_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle; void sin_value(void)
{
float value;
value = sin ( angle / 180. * pi );
printf ("\nThe Sin is: %5.2f\n",value);
}
//cos_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle; void cos_value(void)
{
float value;
value = cos ( angle / 180. * pi );
printf ("The Cos is: %5.2f\n",value);
}
正常的步骤
gcc -c main.c haha.c sin_value.c cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
./main

使用make

先准备一个makefile文件

$vim makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
$make
$make 再一次

make比shell脚本好在:它能主动判断哪一个源代码有修改过,并仅更新该文件

makefile的基本语法和变量

target: target_file1 target_file2 ...
<tab> gcc -o exe_file_name target_file1 target_file2 ...
  • makefile中#代表注释
  • <tab>需要在命令行的第一个字符
  • target与其依赖文件之间要用:分隔

如果想拥有两个以上的操作时,可如此制作makefile文件

main: main.o haha.o sin_value.o cos_value.o
gcc main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -fv main main.o haha.o sin_value.o cos_value.o test:
$make clean
$make main

再改进一下:

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -fv main ${OBJS}

变量的基本语法:

  • 变量与变量内容以=分隔,两边允许空格
  • 变量左边不可以有tab, :
  • 变量应该大写
  • 使用方式,以${变量}的形式

简单的makefile的更多相关文章

  1. 简单编写Makefile

    相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...

  2. Makefile 一点一滴(一)—— 从最简单的makefile模板写起

    我在网上先找了一个最简单的makefile. 建立一个 TestCpp 目录,简单的写几行代码,命名为“TestCpp.cpp”,然后和这个最简单的 makefile 一起扔进去: TestCpp.c ...

  3. 一个简单的Makefile的编写【用自己的话,解释清楚这些】

    用自己的话,解释清楚这些~ Makefile是程序员编写出来指导编译器编译程序源码为目标文件(可执行文件,或链接库) 这里只写一个简单的Makefile 作为例子 其需求如下: frank@ubunt ...

  4. linux学习 建立静态库,动态库,写简单的makefile

    建立静态库 建立四个文件 bin(可运行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件里运行 1)gcc -c add.c //编译add.c ...

  5. GNU Make 学习系列一:怎样写一个简单的Makefile

    编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...

  6. 一个简单的makefile文件

    一个简单的makefile文件:可以编译指定目录下的所有c和cpp文件,暂未加入自动头文件的依赖. #!/bin/bash #编译器 CROSS_COMPILING_PATH = #源文件路径 VPA ...

  7. 【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间

    打算学习一下Linux,这两天先看了一下gcc的简单用法以及makefile的写法,今天是周末,天气闷热超市,早晨突然发现住处的冰箱可以用了,于是先出去吃了点东西,然后去超市买了一坨冰棍,老冰棍居多, ...

  8. 几个简单的Makefile

    http://www.blogjava.net/canvas/articles/quick_makefile.html 几个简单适合小程序的Makefile,可直接拷贝使用,自己mark一下,这样长时 ...

  9. Makefile第一讲:一个简单的Makefile

    摘要 假定你对linux已经比较的熟悉,假定你编程已经稍有经验,本文不会对文章作出太多基础性解释,看不懂莫怪,只当作给学习的朋友一个引导思路,我也是一个初学者,边学边写,将学会的教给大家,文章有错误之 ...

  10. 一个简单的makefile文件编写

    下午闲来无聊,就打开很久没动过的linux系统想熟悉熟悉在linux上面编译代码,结果一个makefile文件搞到晚上才搞定,哈哈! 先把代码简单贴上来,就写了一个冒泡排序: sort.h: #ifn ...

随机推荐

  1. 前端入门21-JavaScript的ES6新特性

    声明 本篇内容全部摘自阮一峰的:ECMAScript 6 入门 阮一峰的这本书,我个人觉得写得挺好的,不管是描述方面,还是例子,都讲得挺通俗易懂,每个新特性基本都还会跟 ES5 旧标准做比较,说明为什 ...

  2. CSS HACK 如何书写

    什么是css  hank 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中 ...

  3. 【Android】用Cubism 2制作自己的Live2D——初探Live2D在Android上的运行!

    前言- 上一次我们成功运行了官方给我们的样本,是不是很有干劲啊?!这次我们就来看看Live2D是怎么在手机上运行的! 准备- 上次运行成功的官方样本——第一次我们先看简单的,就是那个名字叫Sample ...

  4. Go 编译原理实现计算器(测试驱动讲解)

    本文不需要你掌握任何编译原理的知识. 只需要看懂简单的golang语言即可, 完整的代码示例在GIT, 代码是从writing an interpreter in go这本书抽取了简单的部分出来, 如 ...

  5. SQLServer之多表联合查询

    多表联合查询简介 定义:连接查询是关系型数据库最主要的查询,通过连接运算符可以实现多个表连接数据查询. 分类:内连接,外连接,全外连接. 内连接 定义 内联接使用比较运算符根据每个表的通用列中的值匹配 ...

  6. js坚持不懈之15:修改html内容和属性的方法

    1. 修改 HTML 内容 <!DOCTYPE html> <html> <body> <p id = "change">原始内容& ...

  7. 设计模式学习系列(一)——IOC设计原则

    参考转载自IoC 之 2.1 IoC基础 ——跟我学Spring3

  8. CentOS7 升级 gvim 到 8.x 版本

    因为 CentOS7 在默认情况下,通过 yum 安装的 vim-X11.x86_64 版本为 7.x 版本,对 Youcompleteme 支持不好.故需要升级到 8.x 版本. 以下记录 gvim ...

  9. java+testng接口测试入门

    testNG是一个测试框架,它能组织测试用例按照你想要的方式进行运行,并输出一定格式的便于阅读的测试报告(结果),通过java+testng的方式说明一下接口测试的基本使用方法. 一.环境搭建 a)千 ...

  10. Django(四) ORM 外键操作及初识Ajax

    一.内容回顾 1.Django请求的生命周期: ​ 路由系统 -> 视图函数(获取模板+数据 -> 渲染) -> 字符串返回给用户 2.路由系统: /index/ #-> 函数 ...