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编译器的更多相关文章
- 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 <stdio.h> 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编译mesa文件报undefined reference to symbol 'sin@@GLIBC_2.2.5和DSO missing from command line两个错误的解决方案
一.概述 在Linux系统下使用gcc编译用C语言写的mesa的示例程序. 环境:Ubuntu Server 18.04.1 二.问题的出现 在Ubuntu下安装好mesa所需的库文件,将目标文件从g ...
- linux下使用gcc编译运行C/C++程序
编译C 首先,程序编译过程有: 1.预处理(展开宏,头文件,检查代码是否有误) 2.编译(将.c转为汇编代码.s) 3.汇编(将汇编代码.s转为机器代码.o) 4.链接(将所有机器代码.o和库文件链 ...
随机推荐
- leetcode 186. Reverse Words in a String II 旋转字符数组 ---------- java
Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- JS 获取地址栏三级域名
<script type="text/javascript"> function Char(str) { var uchars = {}; str.replace(/\ ...
- SQL语句小总结
无论是面试过程中,还是未来工作中,SQL都是一定会考到和用到的.所以,在此对之前看过的一些SQL知识点进行一下总结和记录,算是起到一个笔记本的作用.没有深入学习过SQL的和对SQL印象不太深的朋友可以 ...
- exiv2 如何改变时间戳
有很多c/c++库可以实现jpeg的exif信息的读取,比如libexif或者CxImage等.但如果我们对jpeg进行有关处理后,想在写入文件时保留原有的exif信息(比如拍摄时间等)就有点棘手了. ...
- [2014.01.27]WFsoft.wfLibrary.wfIniFile 1.5
完全支持.net 2.0编写,对下一代操作系统平稳过渡. 不使用[DllImport("kernel32")]的方式,完全自主的.net 2.0自主解析. 完整支持键 ...
- Node.js的循环与异步问题
(转自:http://bbs.tianya.cn/post-itinfo-280080-1.shtml) Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯 以后就会 ...
- ios中图片拉伸用法
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCap ...
- Java内存区域
1.运行时数据区域 java虚拟机在执行java程序的过程中会将它管理的内存区域分为若干个不同的数据区域.这些区域有各自的服务对象,创建以及销毁时间,有的内存区域随着虚拟机的启动和关闭而创建和销毁,有 ...
- Kafka深度解析,众人推荐,精彩好文!
作者: Jason Guo 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,并保证即使对TB级以上数据 ...