gcc编译器linux官网,linux下的gcc编译器

1. 编译单个文件成可执行文件

gcc hello.c 生成默认的可执行文件a.out

2. 编译单个文件为指定名字的可执行文件,使用-o选项指定文件名字

gcc -o test main.c 生成文件名为test的可执行文件

3. 编译单个源文件成目标文件

(1)使用-c选项生成目标文件

gcc -c main.c 生成文件名为main.o的目标文件

(2)使用-o选项指定目标文件名字

gcc -c -o test.o main.c 生成文件名为test.o的目标文件

4. 同时编译多个源文件成目标文件

使用-c选项生成目标文件

gcc -c main.c print.c 同时生成 文件名为main.o和print.o的目标文件

5. 将多个源文件编译成一个可执行文件

(1)使用-o选项指定可执行文件名,直接编译源文件

gcc -o test main.c print.c 生成文件名为test的可执行文件

(2)先生成目标文件,再链接成可以执行文件

gcc -c main.c print.c 生成多个目标文件

gcc -o test main.o print.o 链接多个目标文件,生成文件名为test的可执行文件

6. 预编译命令和生成汇编命令

(1)使用-E选项进行预编译

gcc -E print.c 进行预编译操作,结果显示在屏幕上

gcc -o print.i -E print.c 进行预编译操作,并生成文件名为string.i的预编译结果文件

(2)使用-S选项进行生成汇编

gcc -S print.c 生成文件名一致(print.s)的的汇编语言文件

gcc -o print.s -S print.c 生成文件名为print.s的汇编语言文件

7. 创建静态库

(1)静态库是目标文件的集合,使用ar和-r选项将目标文件打包成库,库文件通常以“.a”为后缀

ar -rcs libprint.a print.o 生成文件名为libprint.a的静态库

ar -rcs libleo.a print.o string.o 生成文件名为libleo.a的静态库,其中包含print和string的函数库

注意:必须使用目标文件进行归档,如果直接使用源文件进行归档,在后续的编译器链接时会失败

(2)链接静态库

gcc -o test main.c libprint.a 生成文件名为test的可执行文件

(3)使用-l选项和-L选项链接静态库

gcc -o test main.c -lprint 使用-l选项后,就不需要指定lib前缀和扩展名,并会在系统默认目录下查找print函数库,该链接可能失败,因为默认系统库下面没有print函数库,需要使用-L选项指定库的操作路径

gcc -o test main.c -L./ -lprint 在当前目录下查找函数库,如果需要查找多个目录,可以连续使用-L选项

gcc -o test main.c -L./ -L./lib/ -lprint -lstring 在多个目录下查找库

8. 创建动态库

动态库是程序在运行时候加载的库

(1)使用-shared选项生成动态库,使用-fPIC或者-fpic选项生成位置无关的代码

gcc -shared -fPIC -o libleo.so print.c string.c 生成文件名为libleo.so的动态库

(2)链接动态库

gcc -o test main.c -L./ -lleo 生成文件名为test的可执行文件

(3)运行可执行文件

通常程序在执行的时候需要加载动态库,动态库必须在程序的搜索目录下,否则会出现运行时错误。

添加搜索目录的两种办法:

- 添加环境变量:export LD_LIBRARY_PATH=/home/leo/test $LD_LIBRARY_PATH;

- 使用ldconfig /home/leo/test命令,如果不带参数,刷新目录列表,只添加系统默认目录;

(4)动态加载库:

使用dlopen(),dlerror(),dlsym()和dlclose()等相关函数

打开动态库:

原型 void* dlopen(const char* filename, int flag);

void* phandler = dlopen("./libleo.so", RTLD_LAZY);

打开动态库,并库的指针

获取函数指针:

原型 void* dlsym(void* handler, char* symbol);

void* pfunc = dlsym(phandler, "print");

其中pfunc为函数指针

打印错误:

原型 char* dlerror();

char* perror = dlerror();

其中perror为错误信息字符串

关闭动态库

原型 void dlclose(void* phandler);

dlclose(phandler);

编译可执行文件:

gcc -o test main.c libleo.so -ldl

gcc 常用的选项:

-I+dir:扩大头文件的搜索目录;

-L+dir:扩大链接库的搜索目录;

-static:使用静态库进行链接;

-g:包含调试信息;

-On:优化程序;

-Wall:打开所有警告信息;

-Werror:将所有警告信息当成错误消息来处理,并中断编译;

获取最新的gcc版本:

apt-get install gcc

linux下修改gcc编译器版本

可以使用如下命令行来让 gcc 选择不同的 C++ 版本: g++ -std=c++11 main.cpp 在你的系统中,由于编译器或是编译器设定上的差别,操作也许有所不同.

[转]Linux下用gcc/g++生成静态库和动态库(Z)

Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

Linux下用GCC

Linux下用GCC 前言 离职前对做过的支付系统进行了一番#总结,继续完善我的C服务器. 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程的交互数据类型问 ...

Linux环境下的GCC编译器与GDB调试工具介绍

假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include int main() { int day, month, year, sum, le ...

Linux下安装gcc 、g++ 、gfortran编译器

一.ubuntu下gcc/g++/gfortran的安装 1.安装 (1).gcc ubuntu下自带gcc编译器.可以通过“gcc -v”命令来查看是否安装. (2).g++ 安装g++编译器,可以 ...

在CentOS 7.2下升级gcc编译器的版本

默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...

linux下使用gcc编译运行C程序

gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.  在 ...

linux下使用gcc编译运行C/C++程序

编译C  首先,程序编译过程有: 1.预处理(展开宏,头文件,检查代码是否有误) 2.编译(将.c转为汇编代码.s) 3.汇编(将汇编代码.s转为机器代码.o) 4.链接(将所有机器代码.o和库文件链 ...

随机推荐

RNN求解过程推导与实现

RNN求解过程推导与实现 RNN LSTM BPTT matlab code opencv code BPTT,Back Propagation Through Time. 首先来看看怎么处理RNN. ...

HTML之iframe

iframe:是框架的一种形式. 属性: frameborder=0/1 表示是否显示周围边框 0--否 1--是 width,height:设置的边框宽高,具体数值不需要加单位,也可用百分比 mar ...

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

Linux内存调试工具初探-MEMWATCH

C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权.这种自由可能会导致严重的内存管理问题,可能导致程序崩溃或随时间的推移导致性能降级. 内存泄漏(即 malloc()  ...

Confluence 6 降级你的许可证

如果你决定降级你 Confluence 的许可证而削减你的许可证开支,你需要确定当前已经直排的用户许可证数量(在用户许可证页面中)要少于你希望应用的新的许可证的允许用户数量,在你应用新许可证的时候. ...

[MongoDB] MongoDB管理:使用killOp干掉Long Running Operation

http://www.mongoing.com/archives/2563 MongoDB提供了killOp请求,用于干掉运行时间很长的请求,killOp通常需要与currentOp组合起来使用:先根 ...

python常用模块之subprocess

python常用模块之subprocess python2有个模块commands,执行命令的模块,在python3中已经废弃,使用subprocess模块来替代commands. 介绍一下:comm ...

Alpha版总结会议——班级派

一.开会的过程 在周一下午上课的最后20分钟内,我们组进行了“班级派”的alpha版的总结会议.首先进行的是分析目前的版本情况,每个人说了自己的进度,包括已经完成的以及即将要完成的.随后是分析前段时间 ...

CSS命名规范和规则

一.命名规则 ).尽量不缩写,除非一看就明白的单词 二.class的命名 (1).red { color: red; } .f60 {color: #f60; } .ff8600{ color: #f ...

umeng友盟消息推送功能集成

umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: http://dev.umeng.com/push/android/ ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值