Linux开发工具之gcc

linux开发工具

一.gcc入门(上)

1.gcc相关概念

gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C、C++、Java、Pascal、Ada、COBOL语言等;支持多种硬件平台;

gcc不仅仅是本地编辑器,他还能跨平台交叉编译;

gcc有多重语言前端,用于解析不同的语言;

gcc是模块化设计的,可以加入新语言和新CPU架构的支持;

gcc是自由软件;

2.gcc编译程序过程示意图

hello.c-->预处理(cpp)hello.i-->编译器(ccl)hello.s-->汇编器(as)hello.o,printf.o-->链接器(ld)hello

源程序(文本)->被修改的源程序(文本)->汇编程序(文本)->可重定位目标程序(二进制)->可执行目标程序(二进制)

#gcc -E(预处理宏定义的展开) hello.c -o hello.i(目标文件)

#gcc -s(编译) hello.i -o hello.s

#gcc -c(汇编) hello.s -o hello.o(通知gcc取消链接步骤,即编译源码并在最后生成目标文件)

#gcc hello.o -o hello

#./hello

hello

一次完成

#gcc hello.c -o hello

#gcc -c hello.c(只到第三步,不参加链接)

3.-Wall的使用,防止产生预期的错误,出错提醒

#gcc -Wall hello.c -o hello

正确的情况下不提示,错误提醒

4.模块化编译:

#include<stdio.h>

void hellofn();

void main();

两个函数文件的编译链接

#gcc -Wall hellofn.c main.c -o man

#ls

main

#./main

hello

同样也可以,将两个文件都生成链接文件,链接生成目标文件

#gcc -Wall -c hellofn.c -o hellofn.o

#gcc -Wall -c main.c -o main.o

#gcc -Wall hellofn.o main.o -o main

#ls

main

#./main

hello

如果其中一个文件发生改变,只需要编译一部分即可;

如果工程中有许多,独立编译的文件,则需要建立makfile的脚本进行大规模的编译;

小结:

gcc的概念

gcc的特点

gcc编译过程

gcc常用选项

gcc编译多文件

二、gcc入门(下)

01.头文件与库文件

在使用c语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统函数库调用的声明。

库文件是一些预编译好的函数集合,哪些函数都是按照可重用原则编写。它们通常由一组相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)和数据库访问例程(dbm库)等。

02.使用外部库(-l选项)

//calc.c

#include<math.h>

#include<stdio.h>

int main(void)

{

double x = pow(2.0,3.0);

printf("The cubed is %f\n",x);

return 0;

}

#gcc -Wall calc.c -o calc -lm

#ls /usr/lib/libm.a

#ls  /usr/lib/libm.so

03.静态库与共享库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序在运行的时候将不再需要静态库。

动态库(.so或.sa):程序在运行的时候才去链接共享的代码,多个程序共享使用库的代码。

一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。

在可执行文件开始运行以前,外部函数的机器码有操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking)

共享库可以在多个程序间共享,所有动态链接使用得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一根共享库被要用到该库的所有进程公用,节省了内存和磁盘空间。

04.生成静态库

ar(gnu归档工具) rcs(replace and create)

例如:#ar rcs libhello.a hello_fn.o

#gcc -Wall main.c libhello.a -o main

#./main

hello world!!!

#gcc -Wall main.o -o main -lhello(libhello可简写为lhello)

/usr/bin/ld:cannot find -lhello

#gcc -Wall -L.(在当前路径下查找lhello这个库)

在链接生成main可执行文件后,lhello.a静态库文件可以删除

#rm lhello.a

#./main

hello world!!!

#vi ~/.bash_profile

export LIBRARY PATH = /(指定环境变量,到该目录下搜索库)

05.生成共享库

shared:表示生成共享库格式

fPIC:产生位置无关码(position independent)

#gcc -shared -fPIC hello_fn.o -o libhello.so

#ls

libhello.so

#gcc -Wall -L. main.o -o main -lhello

(静态库与共享库同时存在时,优先调用共享库)

#cp main /tmp

#./main

./main error:……

第一种方法:

#cp libhello.so /usr/lib

#./main

hello world!!!

第二种方法:更改LD_LIBRARY_PATH(当前用户)

#vi ~/.bash_profile

增加该文件路径

第三种方法:ldconfig,配置ld.so.conf,ldconfig更新ld.so.cache

#vi /etc/ld.so.conf

(修改路径)

#ldconfig(更新命令)

#ldd main

(main程序包含了哪些库)

#ldd hello

(hello包含了哪些库)

小结:

使用外部库:-lhello

静态库与共享库:三种方法

生成静态库

生成动态库

时间: 2024-12-17 04:27:30

Linux开发工具之gcc的相关文章

Linux开发工具的使用

1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1.   Linux开发工具的使用 Vim编译的使用 Ibm的Vim 实用技术 http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html

Linux开发工具集

最近工作学了不少linux下的新东西,下面这些工具主要针对c/c++,以后慢慢补充一些好用的工具. 编辑器 vim emacs kate(KDE下一个功能强大的编辑器) IDE(集成开发环境) eclipse+cdt clion qt cteator 编译器 gcc g++ clang 调试器 gdb 构建工具 cmake make 内存工具 Purify Valgrind工具集 KCachegrind 剖析工具 gprof开源剖析工具,通常作为gcc编译器的一部分. Quantify是IBM的

Linux编译工具:gcc温习

并做了自己的修改 1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++.java.Pascal等语言.gcc支持多种硬件平台. 2. gcc的特点 gcc是一个可移植的编译器,支持多种硬件平台.例如ARM.X86等等. gcc不仅是个本地编译器,它还能跨平台交叉编译.所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行.而gcc编译

Linux开发工具-Eclipse

1.下载eclipse http://www.eclipse.org/downloads/ 备注: eclipse有标准版和为各种应用专门配置的版本,如for java,for C++是在标准版的基础上集成了JAVA开发插件和C++开发插件,只需下载其中一个版本,在下载响应的插件就能支持多个开发环境. 2. 安装eclipse 3.安装相关插件 4.配置eclipse环境

Linux开发工具

GCC的编译流程分为了4个步骤,分别为 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) GCC使用的基本语法为: gcc [option | filename] 预处理阶段 gcc –E –o [目标文件] [编译文件] 选项"-E"可以使编译器在预处理结束时就停止编译 选项"-o"是指定GCC输出的结果. 编译阶段 gcc –S –o hello.s hello.i 选项"-S&q

三、Linux 开发工具使用(持续学习更新ing……)

一.Nginx 的使用 1.启动nginx1 $ nginx -c /{自定义位置}/nginx.conf 2.停止nginx $ nginx -s stop 3.重启nginx $ nginx -s reload 二.vi/vim 的使用 $ ?<string> - 搜索指定字符串 原文地址:https://www.cnblogs.com/changbaihe/p/10196473.html

Linux开发工具_yum使用

yum 的说明与使用 1.什么是yum? 软件包管理器 提供了查找.安装.删除某一个.一组甚至全部软件的命令 命令简洁好用 2.yum语法 yum [ 选项 ] [命令] [安装包] 选项: -h help帮助命令 -y 安装过程选择项全为yes -q 不显示安装过程 常用命令: 1-yum list 列出所有可安装的软件清单 2-yum updata 更新所有软件 3-yum check-updata 列出所有可更新的软件清单 4-yum install <package_name> 安装指

用VS2013+VELT-0.1.3进行Linux开发:环境搭建

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs2013 + velt-0.1.3 1.1    什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序

Vs2012在Linux开发中的应用(1):开发环境

在Linux的开发过程中使用过多个IDE,code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE,如VisualDsp等,感觉总是不如vs强大好用.虽然VS并不提供gcc的编译和调试支持,在之前的开发中只能充当一个编辑器的作用,但VS提供了强大的SDK,本文将探讨如何扩展VS,使之支持Linux的开发. 其实像Visual Gdb之类的工具已经有了类似的功能,无非不免费而已,做这件事只有一个原因:好玩-- 1.1     开发环境 主机开发环境: