单一程序

准备一个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. python的学习笔记01_3 基本运算符 流程控制if while 字符串常用办法

    基本运算符 运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运 ...

  2. Ubuntu 服务器443端口证书配置

    配置虚拟主机: cd /etc/apache2/sites-available 从默认的模板文件中复制过来一份进行自己的配置: sudo cp ./default-ssl.conf ./mysite1 ...

  3. DEDE整站动态/静态转换

    方法一:使用DEDE后台的SQL命令行工具 入口:织梦后台-系统-SQL命令行工具 DEDE整站动态化 将所有栏目设置为“使用动态页”: 将所有文档设置为“仅动态”: DEDE整站静态化 将所有栏目设 ...

  4. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  5. selenium-webdriver的二次封装(十)

    接着上篇随笔 selenium-配置文件定位元素 ,进行了配置文件设置后,将配置文件运用到定位元素中 思路:拿到定位的 key 和 value 后,对 webdrvier 中定位进行封装,使可以直接运 ...

  6. 解析SQL Server之任务调度

    在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎 与SSMS抽象 ...

  7. RPM-GPG-KEY详解

    GPG在Linux上的应用主要是实现官方发布的包的签名机制 GPG分为公钥及私钥 公钥:顾名思意,即可共享的密钥,主要用于验证私钥加密的数据及签名要发送给私钥方的数据 私钥:由本地保留的密钥,用于签名 ...

  8. LeetCode算法题-Self Dividing Numbers(Java实现)

    这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...

  9. 接口Set

    Set接口简介 java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Coll ...

  10. MVC 全局过滤器

    1. 新创建一个类 CheckLogin2. 在类中加入以下代码 public class CheckLogin : ActionFilterAttribute { public override v ...