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. __init__.py在Python中的用处

    1.Python中的package定义很简单,其层次结构与程序所在目录的层次结构相同, 这一点与Java类似,唯一不同的地方在于,python中的package必须包含一个__init__.py的文件 ...

  2. elasticsearch-集群管理

    1.集群结构 ES 通常以集群方式工作.以提高搜索性能.容错能力.高可用.实现PB级数据搜索. 相关概念: (1)结点: ES集群由多台ES服务器组成.每个ES 服务端就是个一个NODE结点 (2)分 ...

  3. cisco路由器license的相关命令简单梳理(转)

    转自https://blog.51cto.com/legendland/1900185作者:legendlandlicense:对于IP Base基本的IOS功能外,另外三个技术包(1 数据Data: ...

  4. 15)png图片旋转贴图

    1)基本代码展示  还是上一个那个总代码: #include<Windows.h> #include<gdiplus.h>//GDI+的头文件 using namespace ...

  5. android studio 3.2 查看Deveice Monitor

    View菜单下面的 Tool Windows 下面的 Devecie File Explorer

  6. ajax使用json数组------前端往后台发送json数组及后台往前端发送json数组

    1.引子 Json是跨语言数据交流的中间语言,它以键/值对的方式表示数据,这种简单明了的数据类型能被大部分编程语言理解.它也因此是前后端数据交流的主要方式和基础. 2.前端往后台传输json数据 第一 ...

  7. (最全最灵活地)利用Jxl工具包实现Excel表的内容读取 、写入(可向已有表中追加数据)

    1.引子 (1)读取 Jxl工具比较强大,可以方便地实现Excel表的读取和写入.另一款工具Poi也具有相似的功能,并且功能更多,运用也相对复杂.Poi读取Excel表内容时,需要先判断其内容格式,如 ...

  8. Linux-使用syslog来记录调试信息

    1.有三个函数:openlog.syslog.closelog 2.一般的log信息都在操作系统的/var/log/messages这个文件中存储着,但是ubuntu中是在/var/log/syslo ...

  9. LeetCode——264. 丑数 II

    编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 ...

  10. idea快捷键(最常用)

    --跳到上一空白行 ctrl+alt+enter --跳到下一空白行 shift+enter --为代码生成包裹快(try catch等) ctrl+alt+t --跳到某行 ctrl+g --实现父 ...