GCC与静态库、动态库

时间:2021-11-20 14:45:35

GCC 常用指令

1
man gcc

gcc工作流程
例如: gcc hello.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//***第一步***
gcc -E hello.c >hello.i
//-E(预处理),头文件展开,宏替换
//默认打印出来不保存,重定向到hello.i的文件里 //***第二步***
gcc -S hello.i //生成汇编代码,生成hello.s //***第三步***
gcc -c hello.s //将汇编编译成二进制文件,生成
hello.o //***第四步***
gcc hello.o //链接 生成 a.out文件

-I 包含(相对路劲或绝对)路径下的头文件(或目录,下面指的是./include/ 目录)

1
gcc hello.c -I ./include/

指定目标(不是生成a.out)

1
gcc hello.c -I /include/ -o hello

-g –用于gdb调试,不加此选项不能gdb调试

1
gcc hello.c -I ./include/ -o hello -g

-Wall –显示更多的警告

1
gcc hello.c -I ./include/ -o hello -g -Wall

-lstdc++ 用C++的方式去编译

大专栏  GCC与静态库、动态库y>
1
gcc hello.cpp -lstdc++ -o hello

-O 优化选项,1-3越高优先级越高

1
2
3
gcc hello.c -I ./include/ -o hello -g -Wall -O1
gcc hello.c -I ./include/ -o hello -g -Wall -O2
gcc hello.c -I ./include/ -o hello -g -Wall -O3

gcc参数小结:

-I 包含头文件路径

-L 包含库文件的路径

-l 库名 libxxx.so -lxxx

-O 优化选项,1-3级

-W 警告all显示更多

-g 用于gdb调试

静态库

命名规则 lib + 库的名字 + .a 例: libmytest.a

制作步骤

  1. 编译成.o文件 (gcc -c *.c)
  2. 将.o文件打包: ar rcs libmyrepo.a file1.o file2.o
  3. 将头文件与库一起发布(一般而言移动到/include/ 下)

使用静态库

1
2
3
gcc  main.c -o main.app -I include/ -L lib/ -l mytest 

//-l 后面的名字掐头去尾,如libmytest.a ==> -l mytest

优点:执行块,发布应用时不需要发布库
缺点:执行程序体积会比较大,库变更时需要重新编译应用

动态库

使用的时候临时加载进来

制作动态库

  1. gcc -fPIC xxxx.c 编译与位置无关的代码
  2. 将.o文件打包,关键参数 -shared
1
2
gcc -fPIC -c *.c -I ../include/
gcc -shared -o libmytest.so *.o //-o 指定目标libmytest.so

动态链接库的使用

将 libmytest.so 软连接到 /lib 下 (不推荐)
将库路径增加到环境变量LD_LIBRARY_PATH中
配置/etc/ld.so.conf文件 添加需要添加的 .so 文件的路径,执行 sudo ldconfig -v

优点: 执行程序体积小,库变更时一般不需要重新编译应用
缺点: 执行时需要加载动态库,相比静态库而言更慢;发布应用时需要同时发布动态库

GCC与静态库、动态库的更多相关文章

  1. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  2. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

  3. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  4. 转: gcc 指定运行时动态库路径

    gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...

  5. Linux中创建和使用静态库&动态库

    库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...

  6. 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释

    #1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...

  7. 生成lua的静态库.动态库.lua.exe和luac.exe

    前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...

  8. windows库的创建和使用:静态库+动态库

    windows库的创建和使用:静态库+动态库   一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...

  9. C++开发新版本vs使用旧版本vs编译的静态库动态库

    关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成 ...

  10. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

随机推荐

  1. mount分区为读写属性

    对于只读文件系统, 如果想要挂载为可读写的, 需要重新mount下, 如将config分区mount为读写的分区: mount -o remount,rw /config

  2. [充电][ios]ios充电接口

    知乎推荐:http://www.zhihu.com/topic/19693633/top-answers 外文教学网站: http://www.raywenderlich.com/ 著作权归作者所有. ...

  3. .net sql 防注入 httpmodule

    1 新建一个类,实现IHttpModule接口 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  4. MySQL配置文件详解

    MYSQL 配置文件详解 “全局缓存”.“线程缓存”,全局缓存是所有线程共享,线程缓存是每个线程连接上数据时创建一个线程(如果没有设置线程池),假如有200连接.那就是200个线程,如果参数设定值是1 ...

  5. 查看dll或lib中包含的函数

    这个功能主要用于检测是否包含自己所需的函数,可能在解决 error LNK2019 时会用到. dumpbin /exports avcodec.lib /out:test.txt

  6. 简化equals()方法的重写

    实例说明 在定义类时,属性可以是基本类型也可以是引用类型.当重写equals()方法时一会要用“==”来比较基本类型,一会要用equals()比较引用类型,这样代码看着有些混乱.为此推荐使用Commo ...

  7. bootstrap网格设置等高度

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title&gt ...

  8. npm、cnpm、bower安装区别

    简单地说,就是帮你下载好你需要的css或者js库,而且三者功能也都是一样的.那为什么要下载这3个不同的呢?据说npm容易被墙……而cnpm是淘宝的镜像,所以通常用cnpm代替npm.至于bower,是 ...

  9. Android 4&period;4中AudioRecord用例 - 录制系统内置声音

    通过API 19新加的MediaRecorder.AudioSource.REMOTE_SUBMIX參数能够让系统App录制系统内置的声音,也就是扬声器的声音.以下是一个巨简单的样例来演示样例怎样通过 ...

  10. 20155218 《Java程序设计》实验二(Java面向对象程序设计)实验报告

    20155218 <Java程序设计>实验二(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)单元测试 主要学习安装和使用junit来测试编写的程序,并学习以TDD(Test ...