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. this 深度面试题3

    window.val = 1; var obj = { val: 2, dbl: function () { this.val *= 2; val *= 2; console.log(val); co ...

  2. Thread--停止线程

    参考:http://blog.sina.com.cn/s/blog_6ca570ed01016mti.html Thread.interrupt()方法不会中断一个正在运行的线程.它的作用是,在线程受 ...

  3. 撤销上一次的commit

    撤销上一次的commit git reset HEAD~ 如果是撤销所有的已经add的文件: git reset HEAD .

  4. Eclipse 常见Maven web项目

    我是从工作到现在一直用的IDEA,编程软件只要你会技术都没什么区别,只是熟与不熟. 1.下载eclipse软件 百度上搜索eclipse或者到官网https://www.eclipse.org/dow ...

  5. 吴裕雄--天生自然 JAVA开发学习:正则表达式

    import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String conten ...

  6. 由AnnotatedElementUtils延伸的一些所思所想

    这篇博客的两个主题: spring的AnnotatedElementUtils 个人源码阅读方法论分享 为什么要分享AnnotatedElementUtils这个类呢,这个类看起来就是一个工具类,听起 ...

  7. sql plus笔记

    指令请走这边 因为sql plus缓冲区有限 所以要查看输出有时会不太方便 使用spool语句将输出写入文件 sql>spool 要保存的完整路径 ; ; ; sql output; ; ; s ...

  8. 批量刷数据sql

    update t_free_m**  m set m.plate_no = ( select v.plate_num from t_wh_vehi*** v where v.vin = m.car_v ...

  9. 题解-------CF235B Let's Play Osu!

    传送门 题目大意 求出总得分的期望值. 思路 还没有学习数学期望的小朋友赶紧去学一下数学期望,这里只提供公式: $E\left ( x \right )=\sum_{k=1}^{\infty }x_{ ...

  10. mnist数据集下载

    http://yann.lecun.com/exdb/mnist/ THE MNIST DATABASE of handwritten digitsYann LeCun, Courant Instit ...