GNU C语言开发环境
1. GNU C 编译器 2. GNU make 项目管理工具 3. 创建和使用函数库 4. GNU C 函数库(glibc)
1.GNU C 编译器
使用 c语言 编写的代码,运行前必须经过编译和链接,最终生成可执行程序。(编译,编译语言源代码;链接,链接引用的函数库。)这个孕育的过程,需要一些工具、一些函数库,其中这个工具就叫做“编译器”。
GNU C 编译器叫做 gcc,gcc包含了预处理器、编译器、汇编器、链接器等。语法格式:
$ gcc [option] dest_file source_file
| 选 项 | 功 能 |
|---|---|
| Wall | 打印警告信息 |
| g | 添加调试信息到输出文件 |
| O o0 o1 o2 | 优化选项,多个同时出现时,最后一个生效 |
| I | 指定头文件搜索路径,可以出现多个 |
| L | 指定库文件搜索路径,可以出现多个 |
| l | 指定引用的库 |
| static | 使用静态链接 |
| shared | 使用动态链接 |
| E | 输出预处理后的文件 |
| S | 编译生成的汇编文件(.s) |
| c | 编译生成的目标文件(.o) |
| o | 指定输出的文件名(default:a.out) |
编译hello world为例:
[view@file ]$ gcc -S hello.c // 生成汇编代码
[view@file ]$ ls
hello.c hello.s
[view@file ]$ gcc -c hello.c // 生成目标代码
[view@file ]$ ls
hello.c hello.o
[view@file ]$ gcc hello.o // 链接目标文件
[view@file ]$ ls
a.out hello.c hello.o
[view@file ]$ ./a.out
hello world.
[view@file ]$ gcc -Wall hello.c -o hello // 打开警告信息,指定可执行文件名称
[view@file ]$ ls
hello hello.c
[view@file ]$ ./hello
hello world.
2.GNU make 项目管理工具
项目中,常采用模块化开发,将系统分解为多个模块,每个模块完成特定的功能。如此分了模块,便会出现多个源代码文件。在调试阶段,可能会反复编译链接,会出现繁琐的重复操作。于是,make 应运而生,来代替手动的繁琐重复操作。make 还可以规避编译未修改源代码的文件。
2.1.格式
make 工具可以从文本文件读取编译规则,每条规则的语法如下:
目标列表:依赖的文件列表
<tab>命令1 # 每行命令的开头必须有一个 tab空白符
<tab>命令2 # 可以存在多条命令
每条规则由:依赖关系和命令两部分组成。所有的命令开头需要有个tab,以#开头表示注释的内容。
make 命令的语法:
$ make [option] [目标] // 创建指定的目标(默认首个目标)
$ make -h // 显示所有的make选项
规则文件 Makefile 举例:
hello:hello.o
gcc -o hello hello.o
hello.o:hello.c
gcc -c -o hello.o hello.c
clean:
rm -f *.o
2.2.变量
变量的定义和引用,跟 Shell 中一样。
CC = gcc
INSTALL = install
CFLAGS = -O2 -Wall -W -Wshadow
OBJS = main.o prelogin.o postlogin.o privsock.o \
tunables.o secbuf.o ls.o .c.o:
$(CC) -c $*.c $(CFLAGS) $(IFLAGS) install:
if [ -x /usr/local/sbin ]; then \
$(INSTALL) -m fint /usr/local/sbin/fint; \
else \
$(INSTALL) -m fint /usr/sbin/fint;
fi
GNU make 预定义了一些变量,在 Makefile 文件中可以直接使用,也可以对这些变量进行重新定义。
| 预定义变量 | 含义 | 默认值 |
|---|---|---|
| RM | 删除文件 | rm -r |
| $^ | 规则中出现所有依赖文件 | |
| $< | 第一个依赖文件的名称 | |
| $? | 规则中出现所有依赖文件(修改日期比目标创建时间新) | |
| $* | 目标文件名称(略去扩展名) | |
| $@ | 目标文件名称 |
变量分类:
- 自定义变量
- obj=a.o b.o c.o d.o
- obj=10
- makefile自带变量,大写
- CPPFLAGS
- CC
- 自动变量,只出现在命令中
- $@ 规则中的目标
- $< 规则中的第一个依赖
- $^ 规则中所有的依赖
2.3.通配符
允许在规则中使用通配符,支持三种通配符:“*”、“%”、“?”、“[]”。例子见2.4节
2.4.规则
- 常见规则
规则有时常常简化,分别称为隐含规则、后缀规则、模式规则。
1.隐含规则 c程序中,由 .c 生成 .o 文件时,在未给出命令时,由 make 自动添加。 hello:hello.o
hello.o:hello.c 生成目标文件时,依赖是个头文件 fint.o:find.h tom.h 目标文件是个伪目标,“make clean”、“make install”命令执行时激活伪目标。 clean:
rm -f *.o
install:
install -oview -gview -m700 -T *.out dest/bin/hello
install -oview -gview -m700 -t dest/lib lib*.so lib*.a 2.后缀规则 定义了将具有某后缀的文件转换为具有另外后缀的文件的方法。 # .c 文件转换为 .o 文件
.c.o:
gcc -c $< 3.模式规则 定义了一类具有相同行为特点的规则,%表示通配。 %.o:%.c
$(CC) -c $< -o $@ 如此,改写规则文件 %.o:%c
$(CC) -c $< -o $@
OBJS=hello.o
hello:$(OBJS)
gcc -o $@ $^
hello.o:hello.c
clean:
rm -f *.o
2.5.搜索路径
处理的文件较多时,目录结构较复杂。当需要推导文件的依赖关系时,又需要指明路径。make 的解决方法是,提供一个供搜索的路径,不必指明目录信息。设置一个 VPATH 变量,若当前目录没有找到文件时,就去搜索该变量的路径信息。
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) export srctree objtree VPATH
2.6.显示命令
打印一些信息到屏幕……
[view@file ~]$ sed -n -e '115p' -e '131,132p' -e '176,177p' Makefile # 显示部分内容
begin:
@echo -e "Begin Pretreatment...\n" # 显示信息、打印空行
@sleep 1
@echo -e "Begin Compile...\n" # 显示信息、打印空行
@sleep 1
[view@file ~]$ make begin # 展示部分内容的效果
Begin Pretreatment... Begin Compile... Begin Link... [view@file ~]$
2.7.保守赋值
Makefile 文件中
vpath = include |
普通赋值 |
vpath := include |
避免变量递归赋值 |
vpath ?= include |
首次定义的变量才会被赋值 |
vpath += include |
追加变量的值 |
2.8.函数
makefile中所有函数都有返回值
- wildcard
查找指定目录下的指定文件
- patsubst
匹配替换
srcfile=$(wildcard ./*.c)
desfile=$(patsubst %.c, %.o, $(srcfile))
srcfile=$(wildcard ./*.c)
desfile=$(patsubst %.c, %.o, $(srcfile))
method:
@echo $(srcfile)
@echo $(desfile)
2.9.伪目标
- 生成非终极目标:make 目标名
- 生命伪目标:.PHONY: 目标名
.PHONY:test
test:
@echo $(str)
3.创建和使用函数库
函数库可分为两种类型,静态库和共享库。函数库是由某些目标文件(.o)组成的,静态库命名为 libxxx.a,动态库常命名为 libxxx.so。编译器在链接阶段,会把静态库嵌入至可执行文件中,会把动态库的“快捷方式”存储到可执行文件中。
3.1.静态库
静态库有 ar 工具创建。ar 命令语法如下:
$ ar [option] [tarfile] filelist
| 选 项 | 功 能 |
|---|---|
| -d | 从库中删除对象 |
| -r | 向库中插入对象(存在则替换) |
| -t | 显示库中对象列表 |
| -x | 从库中提取对象 |
| -c | 创建库 |
写两个c源程序,分别为一个函数,制作一个静态库。
[view@file lib]$ gcc -c -Wall *.c
[view@file lib]$ ar -cr libmy.a *.o
[view@file lib]$ ar -t libmy.a
add.o
count.o
使用该静态库时,先定义静态库的应用接口
extern int add(int x, int y)
extern int count(int * p);
写一个主程序,调用刚刚生成的库 libmy.a 。
# 使用libmy.a,库名为my
[view@file lib]$ gcc -Wall main.c -L. -lmy
3.2.动态库
创建共享库(动态库),使用gcc命令创建。使用共享库,编译主程序。
[view@file lib]$ gcc -c add.c -fPIC // 编译共享库源程序须选项 -fPIC
[view@file lib]$ gcc -c count.c -fPIC // 不加该选项,在链接时会报错
[view@file lib]$ gcc -shared add.o count.o -o libmy.so // 创建动态库
[view@file lib]$ gcc -Wall main.c -L/home/view/cpro -lmy -o main
Linux系统中 glibc 常用库文件目录
头文件
/usr/include // 系统头文件
/usr/local/include // 本地头文件
函数库
/lib // 系统必备共享库
/usr/lib // 标准共享库和静态库
/usr/X11R6/lib // X11R6 的函数库
/usr/local/lib // 本地函数库
添加库,除了把库文件放到以上路径,还可以自定义路径
vi /etc/ld.so.conf.d/xxx.conf
ldconfig
GNU C语言开发环境的更多相关文章
- 「C语言」在Windows平台搭建C语言开发环境的多种方式
新接触C语言,如何在Windows下进行C语言开发环境的搭建值得思考并整理. 以下多种开发方式择一即可(DEV C++无须环境准备). 注:本文知识来源于 Windows 平台搭建C语言集成开发环境 ...
- 实验四:Linux系统C语言开发环境学习
项目 内容 这个作业属于哪个课程 班级课程主页链接 这个作业的要求在哪里 作业要求 学号-姓名 17043133-木腾飞 作业学习要求 1.学习Linux系统中如何查看帮助文档:2.在Linux系统中 ...
- Go语言开发环境配置
一.我为什么要学习go语言 当今已经是移动和云计算时代,Go出现在了工业向云计算转型的时刻,简单.高效.内 置并发原语和现代的标准库让Go语言尤其适合云端软件开发(毕竟它就是为此而设计的).到2014 ...
- PyCharm/IntelliJ IDEA Golang开发环境搭建(最方便快捷的GO语言开发环境)
IntelliJ太牛了.为了配置Go语言开发环境,折腾了半天,下IDE(Sublime Text,IntelliJ Idea),然后装Go插件.装Go插件还要下载插件项目源码,编译等等,Sublime ...
- 「C语言」Windows+EclipseCDT下的C语言开发环境准备
之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...
- (转载)Go语言开发环境配置
一.我为什么要学习go语言 当今已经是移动和云计算时代,Go出现在了工业向云计算转型的时刻,简单.高效.内 置并发原语和现代的标准库让Go语言尤其适合云端软件开发(毕竟它就是为此而设计的).到2014 ...
- 研究实验1_搭建一个精简的C语言开发环境(包含部分经典的前言)
综合研究: 在这部分内容中,将启示我们如何进行独立研究和深度思考(一定要注意这一点,相应的调整自己的学习思想).同时使我们: (1)认识到汇编语言对于深入理解其他领域知识的 ...
- 安装Go语言开发环境
安装Go语言开发环境实例代码 - 详述Go语言安装所在需要的工作:安装C语言工具,安装Mercurial,更新go到新版本等操作实例. 安装go环境 1.简介 Go是一个开源项目,采用BSD授权协议. ...
- 通过搭建一个精简的C语言开发环境了解一个C程序的执行过程
一.如何搭建一个精简的C语言开发环境 准备:下载TC2.0,并解压,比如说“d:\tc2.0\tc”目录 1.在C盘建立一个目录minic c:\ md minic 2.从解压的目录中将以下文件拷贝到 ...
随机推荐
- python编码encode decode(解惑)
关于python 字符串编码一直没有搞清楚,今天总结了一下. Python 字符串类型 Python有两种字符串类型:str 与 unicode. 字符串实例 # -*- coding: utf-8 ...
- Hanlp在ubuntu中的使用方法介绍
HanLP的一个很大的好处是离线开源工具包,换而言之,它不仅提供免费的代码免费下载,而且将辛苦收集的词典也对外公开啦,此诚乃一大无私之举.我在安装的时候,主要参照这份博客: blog.csdn.net ...
- Oracle存储过程和自定义函数笔记
学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...
- Visual Studio 2008(C#)XML注释提取成帮助文档的方法
Visual Studio 2008(C#)XML注释提取成帮助文档的方法 1.给方法和类添加XML注释 可以手动添加,具体规则可以看MSDN:http://msdn.microsoft.co ...
- Mule ESB 介绍
Mule ESB 介绍 博客分类: ESB ESB 1. 简介 Mule ESB是一个基于Java的轻量级企业服务总线和集成平台,允许开发人员快速便利地连接多个应用,并支持应用间的数据交换.Mule ...
- Delphi 与 C/C++ 数据类型对照表
Delphi 数据类型 C/C++ ShorInt 8位有符号整数 char Byte 8位无符号整数 BYTE,unsigned short SmallInt 16位有符号整数 short Word ...
- [蓝桥杯]ALGO-51.算法训练_Torry的困惑(基本型)
题目描述: 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2...……这样的数叫做质数.Torry突然想到一个问题,前10...……个质数的乘积是多少呢?他把这个问题告诉老师.老师愣住了,一时 ...
- SVM的sklearn实现
转载:豆-Metcalf 1)SVM-LinearSVC.ipynb-线性分类SVM,iris数据集分类,正确率100% """ 功能:实现线性分类支持向量机 说明:可以 ...
- 《Effective Java》笔记-服务提供者框架
静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架(Service Provider Framework)的基础,例如JDBC AP ...
- css文字链接滑过向上移动1像素
方法一:行高 a{line-height:22px;} a:hover{line-height:21px;} 方法二:定位 a{position:absolute;top:0;} a:hover{ ...