其他分享
首页 > 其他分享> > GCC常见命令

GCC常见命令

作者:互联网

rwx 对于目录和文件的区别

文件 目录
r 文件的内容可以被查看。支持cat、more、head...vim 目录的内容可以被查看。ls、tree
w 文件的内容可以被添加、修改、删除。vim > >> 目录的内容(目录项)可以被添加、修改、删除。rm、touch、mv、cp...
x 可执行、可运行。(可执行程序、脚本) 该目录可以被进入。 cd

gcc 编译器

编译过程

  1. 预处理: 预处理器

    • 将 源文件,展开 头文件、替换宏(变量宏、函数宏)、替换 空行、空格、table、注释
    • gcc -E hello.c -o hello.i
      • -E: 预处理选项
      • -o:重命名。
  2. 编译:编译器

    • 逐行检查程序中出现的 语法和词法 错误!简单的逻辑错误。—— 所有编译过程中,最耗时
    • gcc -S hello.i -o hello.s
      • -S: 编译选项,如果编译无误,生成 .s 汇编文件。
  3. 汇编:汇编器。

    • 将 .s 汇编 文件中,的所有汇编指令,翻译成二进制机器码。
    • gcc -c hello.s -o hello.o
      • -c: 汇编选项。 无错误检查。机械翻译。
  4. 链接:连接器。-- ld --

    • 将 .o 的目标文件,链接库文件、数据段合并,地址回填。生成可执行文件。
    • gcc hello.o -o hello
      • 此过程无专用参数。 -o 不是连接过程必须使用的参数。

gcc 的其他参数

动态库和静态库

函数库

静态库

简述

制作

  1. 生成 *.o 目标文件。

    gcc add.c sub.c mul.c -c  ---->  add.o sub.o mul.o 
    
  2. 制作静态库

    ar rcs lib静态库名.a add.o sub.o mul.o
    	# ar:制作静态库的工具。 gcc 不具备制作静态库功能。
    	# r:更新。c:创建(可省)。s:建立索引。
    	# 静态库库名,必须lib开头,以.a 。 --- 使用 file lib静态库名.a 查看。
    
  3. 使用静态库

    gcc ./src/hello.c -o app -L ./lib -l mymath -I ./inc
    
  4. 查看静态库

    file libmymath.a
    
    libmymath.a: current ar archive
    

动态库(共享库)

简介

重点强调

  1. 动态库是否加载到内存,取决于 “程序是否运行”。
  2. 动态库加载至内存的位置,不固定。

制作

  1. 生成与位置无关的 目标文件:

    gcc -fPIC -c add.c mul.c sub.c
    
  2. 制作动态库

    gcc -shared -o libmymath.so add.o sub.o mul.o
    
  3. 测试使用动态库

    gcc hello.c -o app -L ./lib -l mymath -I ./inc 
    
  4. 查看动态库

    file libmymath.so 
    
    libmymath.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=8e82c257df06f7e69e5b0e2c30d2056f4f13422b, not stripped
    
  5. 启动 程序 ./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 可执行文件名

  6. 解决上述错误。 —— 基本思想:给 动态链接器 指定 动态库路径。

    1. 环境变量法 。

      • export LD_LIBRARY_PATH=./lib 将当前动态库所在目录,加入到环境变量中。

      • 终端一旦退出,环境变量的修改无效。

    2. 配置文件法:

      • 将上述修改环境变量的指令,写入到 ~/.bashrc 中

      • 每次启动终端,自动生效

    3. 拷贝法:

      • 受程序使用 libc 库的启发。将自定义的 libmymath.so 文件 拷贝到 /lib 或 /usr/lib 中

      • 为了执行用户自定义程序。需要修改系统配置。

    4. 【推荐使用】缓存文件法:

      1. 通过修改配置文件,修改缓存文件,生成动态连接器需要搜寻的新目录位置。

      2. 打开配置文件:sudo vim /etc/ld.so.conf

      3. 修改配置文件:将 动态库 的绝对路径添加到 /etc/ld.so.conf 文件中。

      4. 使用 命令 sudo ldconfig -v 动态更新 ld.so.cache 文件(二进制文件)。 该文件直接影响动态连接器搜索动态库位置。

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,sub,常见,gcc,命令,add,mul,动态,hello
来源: https://www.cnblogs.com/Albert-lihai/p/16581646.html