gcc编译过程

  1. 预处理,gcc -E.c->.i 展开宏和头文件,替换条件编译,删除注释、空白和空行
  2. 编译, gcc -S.i -> .s 检查语法规范 【消耗时间和系统资源最多】
  3. 汇编,gcc -c, .s->.o将汇编指令编译成汇编指令
  4. 链接, gcc, .o->.out,数据段合并,数据地址回填,连接成可执行文件
gcc -E aa.c -o aa.i
  • -o 用来指定生产的文件名

编译参数

  1. 指定头文件

当头文件和主文件不在一个目录时。

# I 指定头文件的目录
$ gcc -I ./head/ aa.c -o aa

或者在引入头文件时,指定相对路径

#include "./head/bb.h"
  • -I 头文件
  • -c 只做预处理、编译、汇编。得到二进制文件
  • -g 编译调试 ,gdb
gcc aa.c -o aa.out -g
gdb aa.out
  • -v | --version 查看gcc版本号
  • -On n=0-3 编译优化,n越大优化的越多

嵌入式开发一般不需要优化:

int a = 1; // 表示指示灯的开关过程
a = 0;
a = 1;
a = 0;
a = 1;
a = 0;
a = 1;
  • -Wall 提示更多警告信息,如定义变量未使用
  • -D 编译时定义宏,注意-D和之间没有空格

下面这段程序将编译出错。

#include "./head/bb.h"
#ifdef HELLO
#define HI 20
#endif int main()
{
printf("hello world. %d\n", HI);
return 0;
}
$ gcc aa.c

但是可以这样编译: gcc aa.c -D HELLO

  • -E 生产预处理文件
  • -M 生成.c文件与头文件以来关系用户makefile

静态库

制作

# 生成 add.o,汇编
$ gcc -c add.c
$ gcc -c sub.c
$ ar rcs libmymath.a sub.o add.o

使用

因为在链接时期,将程序复制到程序中。所以我们在编译时期应该会发出未定义警告,但是编译器会帮我们做隐式声明。

如何链接?

# 直接指定静态库
$ gcc test.c libmymath.a -o test -Wall
test.c:6:2: warning: implicit declaration of function ‘add’ [-Wimplicit-function-declaration]
add();
# 编译器会做隐式声明

解决警告:

  1. 方法一:在主文件中声明原型
#include <stdio.h>
// 声明原型
long add();
void sub(); int main()
{
printf("test...");
add();
sub();
}

不推荐使用

  1. 方式二:

在静态库源码中,添加mymath.h文件,必须要编译

#ifndef _MYMATH_H_
#define _MYMATH_H_ void add();
void sub(); #endif

包含头文件

#include <stdio.h>
#include "./resource/mymath.h" int main()
{
printf("test...");
add();
sub();
return 0;
}
gcc test.c libmymath.a -o test -Wall

文件结构

├── inc
│   └── mymath.h
├── lib
│   └── libmymath.a
├── resource
│   ├── aa.c
│   ├── add.c
│   ├── add.o
│   ├── sub.c
│   └── sub.o
├── test.c

动态库

Linux动静态库的更多相关文章

  1. gcc使用及动静态库制作

    一. GCC的使用 1. GCC的编译过程 (1)预处理(cpp)gcc -E(输出问价通常以 .i 结尾),将头文件展开,宏替换等操作: (2)编译器(gcc)gcc -S(输出问价以 .s 结尾) ...

  2. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...

  3. linux上静态库链接的有关问题

    求大神,linux下静态库链接的问题有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件, ...

  4. Linux上静态库和动态库的编译和使用

    linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...

  5. linux下静态库的制作

     在我们编写软件的过程当中,少不了需要使用别人的库函数.因为大家知道,软件是一个协作的工程.作为个人来讲,你不可能一个人完成所有的工作.另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把 ...

  6. linux连接静态库

    在项目中发现,使用 -l连接某个库时,如果存在同名的静态库(.a)和动态库(.so),默认会连接.so 那么如何指定连接静态库呢?如果有多个库,有些要连接静态库.有些要连接动态库,连接选项该如何指定呢 ...

  7. gcc总结【基本用法】【选项】【动静态库】(转)

    1.////////////////////////////////////////////////////////////////////////////////////////////////// ...

  8. linux c: 静态库和动态库的生成和使用

    场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i ...

  9. [转帖]Linux 的静态库与动态库

    Linux下的静态库与动态库 2017年02月18日 09:17:13 LLZK_ 阅读数:10257 标签: linux动态库静态库区别使用 更多 个人分类: Linux学习笔记 所属专栏: Lin ...

随机推荐

  1. iOS中常用的手势

    --前言 智能手机问世后的很长一段时间,各大手机厂商都在思考着智能手机应该怎么玩?也都在尝试着制定自己的一套操作方式.直到2007年乔布斯发布了iPhone手机,人们才认识到智能手机就应该这样玩. 真 ...

  2. PTA的Python练习题(二)

    继续在PTA上练习Python (从 第2章-5 求奇数分之一序列前N项和  开始) 1. x=int(input()) a=i=1 s=0 while(i<=x): s=s+1/a a=a+2 ...

  3. python中numpy.concatenate()函数的使用

    numpy库数组拼接np.concatenate 原文:https://blog.csdn.net/zyl1042635242/article/details/43162031 思路:numpy提供了 ...

  4. 第1节 Scala基础语法:9、10、数组

    1. 定义数组时,没有new和有new是有区别的: scala> val arr3 = Array[Int](2)    此时,arr3中仅包含1个元素2arr3: Array[Int] = A ...

  5. Linux centosVMware Linux集群架构LVS DR模式搭建、keepalived + LVS

    一.LVS DR模式搭建 三台机器 分发器,也叫调度器(简写为dir) davery :1.101 rs1 davery01:1.106 rs2 davery02:11.107 vip 133.200 ...

  6. Shell Sort(希尔排序)

    这个排序算法很厉害,我个人很喜欢这个算法,但算法的时间复杂度难计.算法对增量(这里也称作step(步长))的选择也需要注意,只记得个希尔增量的最坏情况为O(n^2).Hibbard增量的最坏情况为O( ...

  7. 129、Java面向对象之static关键字一(修改static变量)

    01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; // 普通属性 private double ...

  8. 自定义autograd

    这个操作博主认为应该是判断其requires_grad是否为True,从而判断是否进行梯度的运算但是至于这个为啥这么写,博主也不是很清楚 device = torch.device('cuda' if ...

  9. 回顾PHP:第一章:PHP基础语法(2)

    十.PHP常量和变量——用常量限制用户跳过某些文件(重要) 十.1常量在代码中定义.书写方式: define(常量名,常量值) 注:1.常量值只能为标量 2.常量名可以小写,但是通常大写 3.常量名可 ...

  10. 十六、JSONObject与JSONArray使用-不刷新页面做回写显示

    需要导入:json-lib-2.2.2-.jar包 1.json:就是一个键对应一个值,超级简单的一对一关系.对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找. String arr ...