GCC工作流程

工作流程

1.预处理 -E xxx.c —> xxx.i

宏替换;头文件展开;注释去掉;

gcc -E hello.c -o hello.i

2.编译 -S xxx.i —> xxx.s #最浪费时间的操作

gcc -S hello.i -o hello.s

3.汇编 -C xxx.s —> xxx.o

gcc -c hello.s -o hello.o

4.链接 (无参数) xxx.o —> xxx(可执行文件)

gcc hello.o -o hello

GCC参数

-o 指定生成的文件的名字

-I 编译时,指定头文件的路径 gcc sum.c -I ./include/ -o sum

-c 将汇编文件生成二进制文件(即:.o文件) gcc sum.c -c -I ./include/ #生成sum.o文件

-g gdb调试时,需要加的参数 gcc hello.c -o app -g

-D 在编译时,指定一个[宏] gcc hello.c -I ./include/ -D DEBUG -o hello

-Wall 添加警告(warning)信息

-On 优化代码,n是优化级别:1,2,3

库的使用

简介

库是什么

二进制格式的源代码 (.c,.cpp)

以头文件的形式提供给用户使用

静态库和动态库的制作和使用

目录结构
  • test //根目录

    • include //头文件存放位置

      • calc.h //calc头文件

    • lib //存放库文件

      • libadd.a libsum.so //静态库和动态库

    • add.c

    • sum.c

    • main.c

    • Makefile

文件内容
calc.h
#ifndef __CALC_H__
#define __CALC_H__
int add(int a,int b);
int sum(int a,int b);
#endif
add.c
#include <calc.h>

int add(int a,int b)
{
return (a+b);
}
sum.c
#include <calc.h>

int sum(int a,int b)
{
return (a-b);
}
main.c
#include <stdio.h>
#include <calc.h>
main()
{
int a=6,b=5;
int the_add=add(a,b);
int the_sum=sum(a,b);
printf("a+b=%d\na-b=%d\n",the_add,the_sum);
}
Makefile
all: main
main: main.c libadd.a libsum.so
gcc main.c -o app -I ./include/ -L ./lib/ -ladd -lsum
lib: libadd.a libsum.so
libadd.a: add.o
ar rcs libadd.a add.o
cp libadd.a ./lib/
add.o: add.c
gcc -c add.c -I ./include/
libsum.so: sum.o
gcc -shared -o libsum.so sum.o
cp libsum.so ./lib/
sum.o: sum.c
gcc -fPIC -c sum.c -o sum.o -I ./include

clean:
rm -rf *.o *.so *.a app

动态库编译运行错误解决办法

在运行生成的二进制文件时可能会报以下错误:

用 ldd 命令查看发现,libsum.so地址找不到

原因
file app    #查看可知app是elf格式的可执行程序

对于 elf 格式的可执行程序,是由 ID-linux.so 来完成的

它先搜索 elf 文件的 DT_RPATH 段——环境变量 LD_LIBRARY_PATH——/etc/id.so.cache 文件列表

——/lib/,/usr/lib 目录找到库文件后将其载入内存。

如何让系统找到共享库
临时设置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
永久生效

用户级别:

vi ~/.bashrc          # 最后一行添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
source ~/.bashrc  #或者重启终端

系统级别:

修改 /etc/profile 文件

拓展链接:跟我一起写Makefile

标准C库函数和Linux系统函数的区别

c库IO函数的工作流程

Linux系统函数就没有f了

c库函数与系统函数的关系

一些链接:

C标准库和Linux系统函数区别(带不带缓冲区)

Linux系统函数功能目录速查

Linux系统函数参考手册

虚拟地址空间

文件描述符

Linux-C基础编程的更多相关文章

  1. [Linux] awk基础编程

    1.awk每次读一行数据,如果设置了-F选项,是在这一行使用分隔符分,$0是全部 2.awk由模式和动作组成 3.条件判断模式{动作} a.txt aaa bbb aaa ccc ddd cat a. ...

  2. linux shell基础编程2

    while循环 语法1: while [ 条件 ] do 命令序列 done 语法2: while read -r line do 命令序列 done (切记while和左中括号一定要有空格) 例子 ...

  3. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  4. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  5. Linux应用程序设计之网络基础编程

    1.TCP/IP协议概述 1.1.OSI参考模型及TCP/IP参考模型 OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下工分为7层:应用层,表示层,会话层,传输层,网络层,数 ...

  6. 【Hadoop离线基础总结】linux的shell编程

    linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...

  7. 【Linux基础总结】Shell 基础编程

    Shell 基础编程 重启虚拟机遇到磁盘损坏如何解决 Shell编程中变量的声明.引用及作用域 Shell程序 概述 以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就 ...

  8. Linux之V4L2基础编程

    Linux之V4L2基础编程 本文内容来源于网络,本博客进行整理. 1. 定义 V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. 2. 工作流程: ...

  9. 【Linux教程】Linux系统零基础编程入门,想当大神?这些你都要学

    ✍ 文件和文件系统 文件是Linux系统中最重要的抽象,大多数情况下你可以把linux系统中的任何东西都理解为文件,很多的交互操作其实都是通过文件的读写来实现的. 文件描述符 在Linux内核中,文件 ...

  10. 20191310李烨龙Linux C语言编程基础

    Linux C语言编程基础 任务详情 0. 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分) 1. 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2 ...

随机推荐

  1. 21天实战caffe笔记_第三天

    1 深度学习工具汇总 (1)  caffe : 由BVLC开发的基于C++/CUDA/Python实现的卷积神经网络,提供了面向命令行.Matlab和Python的绑定接口.特性如下: A 实现了前馈 ...

  2. mysqldump --master-data=2 --single-transaction

    转载于https://blog.csdn.net/linuxheik/article/details/714808821 mysqldump导出数据主要有两种控制:一种是导出的全过程都加锁 lock- ...

  3. IIS发布MVC出错

    一个MVC网站在发布到IIS上时,出现了这个问题: 然后解决办法: 然后应用程序池那里,自己点右键添加一个 新建完应用池之后选中点高级设置 最后,添加网站,添加网站的时候应用程序池选择自己刚刚新建的那 ...

  4. Intellij IDEA导入web项目详解(解决访问的404)

    开始时的首页 点击modules 点击modules界面的Paths 点击Libraries 选择lib文件 点击Facets 选择项目 这就是我404的主要原因,因为小白第一次使用idea 所以很疯 ...

  5. Asp.net 子web application的Session共享

    需求提出: 网站: 父Web Application: http://www.test.com/ 子Web Application 1: http://www.test.com/child1 子Web ...

  6. [整理]html5 WebApp 01

    在正式进入WebApp开发之前,有几个问题要解决: 1.我是产品策划:UI风格,功能设计,产品预期效果(如访问量等各类指标) 2.我是UI设计:图片图标制作,我该按怎样的大小来设计? 3.我是前端开发 ...

  7. Linux - seq 预设外部命令

    seq 是Linux 中一个预设的外部命令,一般用作一堆数字的简化写法. 常用参数: # 不指定起始数值,则默认为 1 -s # 选项主要改变输出的分格符, 预设是 \n -w # 等位补全,就是宽度 ...

  8. grep 正则表达

    常见的 grep 正则表达参数 -c # 显示匹配到得行的数目,不显示内容 -h # 不显示文件名 -i # 忽略大小写 -l # 只列出匹配行所在文件的文件名 -n # 在每一行中加上相对行号 -s ...

  9. tensorflow随机张量创建

    TensorFlow 有几个操作用来创建不同分布的随机张量.注意随机操作是有状态的,并在每次评估时创建新的随机值. 下面是一些相关的函数的介绍: tf.random_normal 从正态分布中输出随机 ...

  10. Hive笔记之Fetch Task

    在使用Hive的时候,有时候只是想取表中某个分区的前几条的记录看下数据格式,比如一个很常用的查询: select * from foo where partition_column=bar limit ...