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

时间: 2024-10-10 10:02:17

linux下的gcc编译器的相关文章

基于Linux下的GCC编译器的内部预宏定义与__attribute__属性

***************************************************************************************************************************** 作者:EasyWave                                                                                    时间:2015.02.20 类别:Linux应用-GCC编

linux下的g++编译器安装

再debian下直接apt-get install gcc g++就能够了.依照类似的逻辑,再Fedora下yum install gcc g++ 报告无法找到g++包. 查了一下,原来这个包的名字叫做gcc-c++.完整的应该是yum install gcc gcc-c++. 注意安装时要先成为root用户.详细的在终端输入su之后会提示输入管理员password,输入之后在终端输入命令行yum install gcc gcc-c++就好了,依照提示一步一步的安装就能够了. linux下的g+

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

Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅 在 linux 下,库文件一般放在 /usr/lib 和 /lib 下, 静态库的名字一般为 libxxxx.a ,其中 xxxx 是该 lib 的名称 动态库的名字一般为 libxxxx.so.major.minor , xxxx 是该 lib 的名称, major 是主版本号, minor 是副版本号

Linux下的GCC编译指令

1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective C 语言.Pascal 语言.COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等.而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了.另一方面,说到 GCC 对于操作系统平

在Linux下使用gcc编译mesa文件报undefined reference to symbol '[email protected]@GLIBC_2.2.5和DSO missing from command line两个错误的解决方案

一.概述 在Linux系统下使用gcc编译用C语言写的mesa的示例程序. 环境:Ubuntu Server 18.04.1 二.问题的出现 在Ubuntu下安装好mesa所需的库文件,将目标文件从github上克隆下来之后编译. 以上截取的是用gcc编译目标文件和传参的介绍: gcc:源程序将用gcc编译器进行编译: osdemo,c:将要被编译的源程序: -lOSMesa:链接OSMesa库: -lGLU:链接GLU库: -lGL:链接GL库: -o:指定目标名称: osdemo:编译后生成

linux下ARM交叉编译器的安装

1.下载arm-linux-gcc编译器. 2.将下载好的编译器压缩文件拷贝到linux中,注意不要在windows中解压,因为RAR解压工具解压gzip压缩工具压缩的文件可能会出问题. 尽量将编译器的压缩文件放置到根目录下(其实也不一定是要根目录,但是我自己使用过程中发现有一个厂家提供的编译器没有安装在指定的位置,编译器提示库找不到),这样做的目的是为了尽量减少麻烦.拷贝好之后,在终端使用: # tar xvzf arm-linux-gcc-4.4.3.tar.gz 解压编译器. 3.解压好了

关于在linux下用gcc编译头文件的问题。

关于在linux下用gcc编译头文件的问题. 2011-01-21 18:5215052135380 | 分类:其他编程语言 | 浏览8139次 有node.h prepare.h list.h file.h 这四个头文件, prepare.h中用到了node.h, list.h中用到了preapre.h , file.h中用到了list.h ,怎么用gcc对这四个头文件进行编译. 分享到: 2011-01-22 02:23 天天爱答题,抽奖送惊喜~ 提问者采纳 我用一个例子来告诉你怎么样在 C

Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2版本后)

本来这个问题真的没必要写的,可是真的困扰我太久%>_<%,决定还是记录一下. 首先,最权威清晰的安装文档还是官方的: Building the NetCDF-4.2 and later Fortran libraries (写此文时,最近版为4.2) 那这个文档最开始就告诉我们,自NetCDF库4.2版本以后,Fortran的库和C的库就要分开build啦!而且要装Fortran的库必须先装好C的库. 所以先装C的库咯:仍然官方文档: Getting and Building NetCDF-C

Linux下用GCC

Linux下用GCC 前言 离职前对做过的支付系统进行了一番#总结,继续完善我的C服务器. 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程的交互数据类型问题: 在 C 进程中我准备将服务器处理后的请求数据存储在一个结构体内,然后将此结构体中的信息传给 PHP,而 PHP 进程内也会有一个全局数组与之对应,可是众所周之,结构体是 C 进程内的内存数据,是无法直接传给 PHP 使用的. 这时候我们也需要一种"协议"来解决进程数据类型的异构性.当