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. cuda addressMode解析

    cudaAddressModeClamp:超出范围就用边界值代替,示意: AA | ABCDE | EE cudaAddressModeBorder:超出范围就用零代替,示意: 00 | ABCDE ...

  2. 阿里云ECSLinux系统下挂载磁盘

    最近公司服务器老是提示磁盘空间不足,原因是以前的业务负责人开了Tomcat的debug日志并且没有做日志轮询,所以日志量非常大.当我做了日志切割轮询后发现磁盘还是太小才40G,按理外网服务器怎么可能这 ...

  3. 深入理解JVM - JVM内存模型

    各版本的差异 JDK1.6 在JDK1.6 的时候运行时常量池在方法区中 JDK1.7 在JDK1.7 的时候运行时常量池在堆中 JDK1.8 在JDK1.8 的时候,JVM内存模型直接将方法区移到了 ...

  4. 编程作业2.2:Regularized Logistic regression

    题目 在本部分的练习中,您将使用正则化的Logistic回归模型来预测一个制造工厂的微芯片是否通过质量保证(QA),在QA过程中,每个芯片都会经过各种测试来保证它可以正常运行.假设你是这个工厂的产品经 ...

  5. 201412-1 门禁系统 Java

    类似于201312-1 出现次数最多的数,了解一下Map的containsKey方法和containsValue方法 **containsKey** boolean containsKey(Objec ...

  6. AtCoder - 4371 Align(分类讨论)

    Align AtCoder - 4371 Problem Statement You are given N integers; the i-th of them is Ai. Find the ma ...

  7. tif图片压缩

    tif图片在ImageIo.read获取时,返回为空,导致无法使用,百度了很久,很多人说jai可以,便去看了下,总结如下: public static void CompressPic(String ...

  8. CSP2019爆零记

    Upd:2019.10.19 初赛 Day 0 CSP-S膜你赛(然而只考一个小时xs) 写(xia)完(xie)有51.5 很虚,很慌 不过CSP-J的模拟有90?(所以CSP-S模拟的码风怎么这么 ...

  9. 10)global预定义变量

    代码展示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. C# 使用 HttpPost 请求调用 WebService (转)

    转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...