GCC常见命令
rwx 对于目录和文件的区别
文件 | 目录 | |
---|---|---|
r | 文件的内容可以被查看。支持cat、more、head...vim | 目录的内容可以被查看。ls、tree |
w | 文件的内容可以被添加、修改、删除。vim > >> | 目录的内容(目录项)可以被添加、修改、删除。rm、touch、mv、cp... |
x | 可执行、可运行。(可执行程序、脚本) | 该目录可以被进入。 cd |
gcc 编译器
编译过程
预处理: 预处理器
- 将 源文件,展开 头文件、替换宏(变量宏、函数宏)、替换 空行、空格、table、注释
- gcc -E hello.c -o hello.i
- -E: 预处理选项
- -o:重命名。
编译:编译器
- 逐行检查程序中出现的 语法和词法 错误!简单的逻辑错误。—— 所有编译过程中,最耗时
- gcc -S hello.i -o hello.s
- -S: 编译选项,如果编译无误,生成 .s 汇编文件。
汇编:汇编器。
- 将 .s 汇编 文件中,的所有汇编指令,翻译成二进制机器码。
- gcc -c hello.s -o hello.o
- -c: 汇编选项。 无错误检查。机械翻译。
链接:连接器。-- ld --
- 将 .o 的目标文件,链接库文件、数据段合并,地址回填。生成可执行文件。
- gcc hello.o -o hello
- 此过程无专用参数。 -o 不是连接过程必须使用的参数。
gcc 的其他参数
- -c:只生成目标文件(过程包含:预处理、编译、汇编)
- -v:查看gcc版本
- -I(大i): 指定 头文件所在目录位置。
- -L:指定库文件所在目录位置。
- -l(小L):指定库名。( 去掉前缀lib 和 后缀 .so 或 .a )
- -g: 使用gdb调试前,编译程序添加! 加-g编译的可执行文件,带有调试表。给gdb提供调试环境。
- -Wall:显示所有的 警告信息。
- -D:在编译期间动态的向程序中,注册变量宏。
- 例:gcc -o test test.c -D MAX=10
动态库和静态库
函数库
本质:一组函数。具有相近的功能或操作同一数据结构。
- <string.h> : strcpy/strcmp/strcat/strlen/strstr/strchr/strtok ....
- 自定义库:<mysort.h> : bubble_sort / select_sort/ quick_sort / insert_sort ....
作用:
- 代码复用。
- 程序积累。
发布形式:
- 源码形式:
- 优点:方便使用者学习和使用。
- 缺点:1. 保密性差。2. 编译程序耗时。3. 编译受平台、版本限制。
- 二进制形式:
- 优点、缺点,与上述相反。
- 源码形式:
我们使用的函数: 标准C库:/lib/x86_64-linux-gnu/libc.so.6
静态库
简述
- 机制:在编译程序时,复制静态库的代码片,到可执行程序中。
- 优点:将函数库中的函数本地化。寻址方便,速度快。(库函数执行效率 == 自定义函数执行效率)
- 缺点:消耗系统资源大,每个使用静态库的程序,都要复制一份,静态库。浪费内存。
- 使用场景:多用于核心程序,保证时效性,可以忽略空间。
制作
生成 *.o 目标文件。
gcc add.c sub.c mul.c -c ----> add.o sub.o mul.o
制作静态库
ar rcs lib静态库名.a add.o sub.o mul.o
# ar:制作静态库的工具。 gcc 不具备制作静态库功能。
# r:更新。c:创建(可省)。s:建立索引。
# 静态库库名,必须lib开头,以.a 。 --- 使用 file lib静态库名.a 查看。
使用静态库
gcc ./src/hello.c -o app -L ./lib -l mymath -I ./inc
查看静态库
file libmymath.a libmymath.a: current ar archive
动态库(共享库)
简介
机制:代码共享。
优点:节省内存(共享)、易于更新(动态链接)
缺点:相较于静态库而言,函数调用速度慢(函数地址“延时绑定”)
使用场景:
- 对程序执行速度要求不是很强烈,而对系统资源有一定要求的场景。
- 对应更新比较频繁程序。
- 停止运行程序
- 使用新库覆盖旧库(保证新库、旧库名称一致。接口一致。)
- 重启程序。
重点强调
- 动态库是否加载到内存,取决于 “程序是否运行”。
- 动态库加载至内存的位置,不固定。
制作
生成与位置无关的 目标文件:
gcc -fPIC -c add.c mul.c sub.c
制作动态库
gcc -shared -o libmymath.so add.o sub.o mul.o
测试使用动态库
gcc hello.c -o app -L ./lib -l mymath -I ./inc
查看动态库
file libmymath.so libmymath.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=8e82c257df06f7e69e5b0e2c30d2056f4f13422b, not stripped
启动 程序 ./app ----> 报错:
./app: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory
错误原因:“动态链接器” ld-linux-x86-64.so.2 搜索动态库的路径没有指定。
- 链接器:工作于 gcc 编译4过程 中的 “链接阶段”。 工作结束,生成 可执行文件。
- 动态链接器:工作于可执行程序运行之后,辅助加载器负责将动态库加载到内存。
查看错误:ldd 可执行文件名
解决上述错误。 —— 基本思想:给 动态链接器 指定 动态库路径。
环境变量法 。
export LD_LIBRARY_PATH=./lib 将当前动态库所在目录,加入到环境变量中。
终端一旦退出,环境变量的修改无效。
配置文件法:
将上述修改环境变量的指令,写入到 ~/.bashrc 中
每次启动终端,自动生效
拷贝法:
受程序使用 libc 库的启发。将自定义的 libmymath.so 文件 拷贝到 /lib 或 /usr/lib 中
为了执行用户自定义程序。需要修改系统配置。
【推荐使用】缓存文件法:
通过修改配置文件,修改缓存文件,生成动态连接器需要搜寻的新目录位置。
打开配置文件:sudo vim /etc/ld.so.conf
修改配置文件:将 动态库 的绝对路径添加到 /etc/ld.so.conf 文件中。
使用 命令 sudo ldconfig -v 动态更新 ld.so.cache 文件(二进制文件)。 该文件直接影响动态连接器搜索动态库位置。
makefile
- 作用:进行项目管理。
- 初步学习:1个规则、2个函数、3个自动变量。
- 要想使用默认的make命令,管理项目。makefile文件名:必须是 “makefile” 或 “Makefile”
makefile的规则
语法:
目标:依赖条件
(一个tab缩进)命令
举例:
hello:hello.c
gcc hello.c -o hello
- 目标的时间,必须晚于依赖条件的时间,否则,更新目标。
- 依赖条件,如果不存在,寻找新的规则去产生依赖条件。
hello:hello.o add.o sub.o mul.o
gcc hello.o add.o sub.o mul.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mul.o:mul.c
gcc -c mul.c -o mul.o
2个函数
wildcard 函数:用来匹配文件名,得到字符串
src = $(wildcard ./*.c) : 匹配当前工作目录下的所有.c文件。将文件名组成列表,赋值给变量 src
相当于: src = add.c sub.c mul.c
patsubst 函数:用来字符串替换
obj = $(patsubst %.c, %.o, $(src)) : 将 参3 中,包含 参1的部分,替换为 参2.
相当于: obj = add.o sub.o mul.o
obj = $(patsubst %.c, %, $(src))
相当于: obj = add sub mul
GCC常见命令的更多相关文章
- GCC常见命令汇总
int main() { test(); } man.c如上: #include <stdio.h> void test() { printf("test\n"); } ...
- 嵌入式Linux开发教程:Linux常见命令(上篇)
摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...
- 2 . Linux常见命令
Linux常见命令格式: 命令名称 选项 参数 ls -alh 文件/目录 --all #ls 显示当前目录内容 #ls -l 显示文件详细信息 #ls -hl h已常见单位显示文件大小 k M G# ...
- [Linux基础]Linux基础知识入门及常见命令.
前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1:192.168.40.11Linux ip:192.168 ...
- GCC常用命令行一览表
GCC常用命令行一览表 这些常用的 gcc/g++ 命令行参数,你都知道么?1. gcc -E source_file.c-E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_ ...
- 关于XShell的常见使用和设置以及Linux中的常见命令.
本文部分转自:http://sundful.iteye.com/blog/704079 和 http://www.vckai.com/p/5 有时候在XShell中操作的一些命令傻傻的分不清这个命令到 ...
- GCC 编译命令
今天突然被同事问道一个GCC编译命令为的问题,感觉对相应内容生疏了,赶紧整理下相关内容,梳理下相关知识. GCC命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再 ...
- gcc/g++命令认识
gcc & g++是gnu中最主要和最流行的c & c++编译器 . g++用来针对c++的处理命令,以.cpp为后缀,对于c语言后缀名一般为.c.这时候命令换做gcc即可. 下面以T ...
- 重启IIS常见命令
重启IIS常见命令 http://jingyan.baidu.com/article/4ae03de30d6cfa3efe9e6b4a.html
随机推荐
- 值得注意的: c++动态库、静态库、弱符号__attribute__((weak))以及extern之间的关系
先说结论: ①:动态库优先级最差,如果同时有静态库和动态库,那么首先使用的是静态库函数. ②:如果只有两个或多个动态库,那么首先使用的是最开始链接的动态库函数: ③:弱符号函数在动态库中是起任何作用的 ...
- 配置中心的设计-nacos vs apollo
简介 前面我们分析了携程的 apollo(见 详解apollo的设计与使用),现在再来看看阿里的 nacos. 和 apollo 一样,nacos 也是一款配置中心,同样可以实现配置的集中管理.分环境 ...
- SQL Server 2019企业版和标准版的区别?
来源公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485400&idx=1&a ...
- .net core 抛异常对性能影响的求证之路
一.前言 在.net 社区中曾经听到过很多关于大量抛异常会影响性能这样的结论,心中一直就存在各种疑问.项目中使用自定义异常来处理业务很爽,但是又担心大量抛业务异常存在性能问题. 查阅了各种文档,微软官 ...
- Java开发学习(四)----bean的三种实例化方式
一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二. ...
- pyenv安装及使用教程
pyenv安装及使用教程 pyenv 安装 git clone https://github.com/pyenv/pyenv.git ~/.pyenv # 编辑 bashrc vim ~/.bashr ...
- 「快速学习系列」我熬夜整理了Vue3.x响应性API
前言 Vue3.x正式版发布已经快半年了,相信大家也多多少少也用Vue3.x开发过项目.那么,我们今天就整理下Vue3.x中的响应性API.响应性APIreactive 作用: 创建一个响应式数据. ...
- Servlet 体系结构
Servlet体系结构 Servlet -- 接口 Genericservlet -- 抽象类 继承类接口 实现了空方法 只需要复写service方法 HttpServlet -- 抽象类 对Ht ...
- cut命令、case与select语句
cut命令 常用参数: -c character 字符 -d delimiter 分隔符 -f field 域(列) --output-delimiter 输出分隔符 例: # echo 12345 ...
- CF333E Summer Earnings
CF333E Summer Earnings 题目 https://codeforces.com/problemset/problem/333/E 题解 思路 知识点:枚举,图论,位运算. 题目要求从 ...