博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gcc的基本用法
阅读量:6271 次
发布时间:2019-06-22

本文共 1696 字,大约阅读时间需要 5 分钟。

linux下gcc的基本用法

gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等

gcc的编译过程

  • 预处理(pre-processing)E:插入头文件,替换宏
  • 编译(Compiling)S:编译成汇编
  • 汇编(Assembling) c:编译成目标文件
  • 链接 (Linking):链接到库中,变成可执行文件

gcc -E hello.c -o hello.i

gcc -S hello.i –o hello.s

gcc –c hello.s –o hello.o

gcc hello.s –o hello 链接,生成可执行文件

/hello 运行

也可以一次性完成:

gcc hello.c –o hello

但一般情况下生成.o文件比较好,可以重定位文件,让别人使用

gcc常用选项

选项名 作用
o 生成目标
c 取消链接步骤,编译源码并最后生成目标文件
E 只运行C预编译器(头文件,宏等展开)
S 生成汇编语言文件后停止编译(.s文件)
Wall 打开编译告警(所有)
g 嵌入调试信息,方便gdb调试
llib 链接 lib 库 (这里是小写 L ) 相当于 C++ #pragma comment(lib, “xxx.lib”)
Idir 增加 include 目录 (这里是大写 i ) 头文件路径
LDir 增加 lib 目录 (编译静态库和动态库)

多模块编译

  • 一次性编译:

    gcc -Wall fun.c main_fun.c –o main_fun

  • 独立编译:

    gcc –Wall –c main_fun.c –o main_fun.o

    gcc –Wall –c fun.c –o fun.o

    gcc –Wall main_fun.o fun.o –o main_fun

多模块编译中如果某一个模块发生了变化,只需要编译更改的模块即可

静态库与共享库(动态库)

静态库(.a)

程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库,生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存

  • 静态库生成(libxxx.a)

    首先生成.o文件,然后通过.o文件生成.a文件

    例如:

    gcc –c fun.c

    ar rcs libfun.a fun.o

  • 静态库使用

    gcc –Wall main.c libfun.a –o main

    gcc –Wall –L. main.c –o main –lfun

    -L.表示在当前目录搜索 libfun.a

  • 静态库搜索路径

    1:编译使用选项 –L 指定的目录(建议)

    2:修改环境变量,搜索指定的目录 设置环境变量 LIBRARY_PATH

    export LIBRARY_PATH=“库目录

    3:lib文件放入系统指定目录,例如/usr/lib/等

共享库(.so或.sa)

程序运行时候才去链接共享库代码,多个程序共享使用,使用时候只需要加载一份到内存

直接可以通过.c文件生成.so文件

例如:gcc –shared –fPIC fun.o –o 

shared:生成共享库格式

fPIC: 产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址

使用: gcc –Wall main.o –o main –L. -lFun

只需要-l+文件名即可

配置方式

1:拷贝到so文件到共享库目录 /usr/lib/

2:更改 LD_LIBRARY_PATH,如果已经有了一个这样的目录,要写成export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“库目录”这样子 如果写在profile配置文件里 export LD_LIBRARY_PA TH="目录:$LD_LIBRARY_PATH"

3:配置 /etc/ld.so.conf; 并使用 ldconfig 命令进行更新

转载于:https://www.cnblogs.com/chaguang/p/8306106.html

你可能感兴趣的文章
走红日本 阿里云如何能够赢得海外荣耀
查看>>
磁盘空间满引起的mysql启动失败:ERROR! MySQL server PID file could not be found!
查看>>
点播转码相关常见问题及排查方式
查看>>
[arm驱动]linux设备地址映射到用户空间
查看>>
弗洛伊德算法
查看>>
【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
查看>>
精度 Precision
查看>>
Android——4.2 - 3G移植之路之 APN (五)
查看>>
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>