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

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

最新文章

  1. NotePad++中如何出去闪烁的光标?
  2. CentOS6.3编译安装Nginx1.4.7 + MySQL5.5.25a + PHP5.3.28
  3. 谁也无法挡住我访问Google---使用Nginx反向代理攻略
  4. cobbler 配置(转载)
  5. win7 64位安装mongodb及管理工具mongoVUE1.6.9.0
  6. How to Configure the Gradient Boosting Algorithm
  7. HDU-4618 Palindrome Sub-Array 暴力枚举
  8. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程
  9. 怎样打开64位 Ubuntu 的32位支持功能?
  10. 分享一个导出数据到 Excel 的类库
  11. 【转】Zookeeper-Watcher机制与异步调用原理
  12. 实例化bean
  13. 团队作业8——第二次项目冲刺(Beta阶段)--第七天
  14. [LeetCode] Equal Tree Partition 划分等价树
  15. 嵌入式C实战项目开发技巧:如果对一个有规律的数组表进行位移操作
  16. 深入理解Linux内核 学习笔记(3)
  17. ZPW-2000电气绝缘移频轨道电路
  18. Spring Data Redis 详解及实战一文搞定
  19. matplotlib 将两张数据视图在一起显示
  20. 学号 20175223 《Java程序设计》第1周学习总结

热门文章

  1. python format输出
  2. sudo: /etc/sudoers is mode 0777, should be 0440 单用户 sudo不用输入密码的方法
  3. HDU 2444 The Accomodation of Students【二分图最大匹配问题】
  4. 函数的配置对象Configuration Objects
  5. 201503-1 图像旋转 Java
  6. 吴裕雄--天生自然 PYTHON3开发学习:基本数据类型
  7. Java搭建WebSocket的两种方式
  8. hasura graphql-engine v1.2.0 beta 版本
  9. uboot对Flash和DDR的分区管理
  10. java内存区域与内存溢出异常(2)