gcc编译生成动态库及gcc参数说明和可变参数的使用

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

      http://blog.csdn.net/lb015331/archive/2011/06/16/6547543.aspx  

      动态库*.so在linux下用c和c++编程时经常会碰到,记录一下(突然用的时候忘了~_~),以便日后查看。

 

 

一、编译动态库

       下面通过一个例子来说明如何操作。我们将hello.c编译成libhello.so。hello.c文件定义了一个print函数,该函数使用了可变参数,该函数也是使用可变参数的一个例子。

 

 

hello.c:

#include <stdarg.h>

int print(const char *fmt, ...)
{
      va_list va;
      int ret = 0;

      va_start(va, fmt);
      ret = vprintf(fmt, va);
      va_end(va);

      return ret;
}

 

 

执行命令:gcc -o libhello.so hello.c -fPIC -shared

然后在当前目录下就可以看到我们要的动态库libhello.so。

如果要使用该动态库有以下几种方法:

1、将该动态库copy到/usr/lib目录下,该目录是动态库的默认路径。

2、在LD_LIBRARY_PATH环境变量中加入该动态库的路径

      export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:该动态库的绝对路径

3、修改/etc/ld.so.conf文件,把该库所在绝对路径添加到文件末尾,并执行ldconfig刷新。 

 


 

二、链接动态库 

        编写main.c程序调用库中的函数,并编译生成可执行文件test。

 

main.c: 

extern int print(const char *fmt, ...);

 

int main()
{
       print("%s%s::%s:%d./n", "this is a  test", " program", __func__, __LINE__);
       return 0;
}

 

执行命令:gcc -o test main.c -L. -lhello

然后在该目录下生成了可执行文件test 

执行命令:ldd test查看该可执行文件所链接的所有动态库。 

 

 

 

三、 gcc、g++参数说明

1、gcc、g++在执行编译的步骤为:

         a.预处理,生成.i的文件[预处理器cpp] 
         b.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 
         c.将汇编转(.s文件)生成目标代码(机器代码)生成.o的文件[汇编器as] 
         d.连接目标代码(.o文件)生成可执行程序[链接器ld] 

 

 

2、常有参数说明 
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  例子用法:
   gcc -c hello.c 
  他将生成.o的obj文件
-S
  只激活预处理和编译,就是指把文件编译成为汇编代码。
  例子用法
  gcc -S hello.c
  他将生成.s的汇编代码,你可以用文本编辑器察看
-E
   只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面。
  例子用法:
   gcc -E hello.c > log.txt 
   gcc -E hello.c | more 
-o
   制定目标名称,缺省的时候,gcc 编译出来的文件是a.out。 
  例子用法:    

        gcc -o hello hello.c 
   gcc -o hello.asm -S hello.c  

 -include file 
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设
定,功能就相当于在代码中使用#include<filename>
  例子用法:
   gcc hello.c -include ~/hello.h     
-Idir
      对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺 
 省的头文件目录查找 

-l-
   就是取消前一个参数的功能,所以一般在-Idir之后使用 
-C
   在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的 
-M
  生成文件关联的信息。包含目标文件所依赖的所有源代码

  例子用法:

       gcc -M hello.c  
-MM
   和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。
   
 -O0、-O1、 -O2 、-O3 
   编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高,一般我们用-O2  
-g
  只是编译器,在编译的时候,产生调试信息。
-static 
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
 动态连接库,就可以运行。
-share
   此选项将尽量使用动态库,所以生成文件比较小,但是需要系统有动态库。
-w

       不生成任何警告信息。 
-Wall

      生成所有警告信息。

-fPIC

      表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

 

        例子用法: 

        gcc -o libhello.so hello.c -fPIC -shared 

 

-shared

      该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接,相当于一个可执行文件。

        例子用法: 

        gcc -o libhello.so hello.c -fPIC -shared 

 

-llibrary 
   制定编译的时候使用的库library,编译器查找动态连接库时有隐含的命名规则,即在给出 的名字前面加上lib,后面加上.so来确定库的名称

  例子用法:

     gcc -o test main.c -L. -lhello 
     使用libhello.so库编译程序  

-LDIR:表示要连接的库在DIR目录中 

        例子用法:

        gcc -o test main.c -L. -lhello 

gccgcc编译动态库(共享库)、静态库|链接静态库、动态库 目录 即看即用 一、GCC 简介 GCC编译流程 GCC编译选项 二、GCC生成动态库静态库 三、生成动态库静态库实例 四、静态库动态库使用配置 静态库的使用 共享库的使用 不到你指定链接的so错误 编译链接静态库、动态库 链接动态库 即看即用 多个源文件/目标生成动态库 a. gcc -fPIC -shared ... 阅读详情

相关推荐

Linux - 如何使用gcc命令生成静态库动态库

Linux下查看是否有静态库:ar  -tv  test.a   一、库的简述 简单的说,库(Library)是由系统提供的一组具有特定功能的函数的集合,是为提高开发效率运行效率而设计的。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库动态库两种。 静态库: 静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,因此利用静态库生成的文件比较大。这类库

YANG 3978

gcc的-l参数,-L参数,-I参数

一、基础知识 链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件。在链接过程中,它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序中多个模块的外部引用。 标准库的大部分函数通常放在文件 libc.a 中(文件名后缀.a代表“achieve”,译为“获取”),或者放在用于共享的动态链接文件 libc.so 中(文件名后缀.so代表“share object”,译为“共享对象”)。这些链接库一般位于 /lib/ 或 /us

sinat_31608641的博客 1万+

使用再生龙还原镜像文件到硬盘

1. 把制作好的再生龙光盘插入需要的电脑,开机按F4使用再生龙启动2. 选择默认的:Clonezailla live(Default settings,VGA 800*600),然后等待几分钟 3. 选择语言:简体中文 4. 选择不修改键盘映射 5. 选择使用再生龙          6. 选择硬盘/分区(存到/来自)镜像文件,此选项既可以制作镜像,也可以恢复镜像。 7. 使用本机的分区     ...

weixin_42168893的博客 1万+

gcc常用的参数

-c         只激活预处理,编译,汇编,也就是他只把程序做成obj目标文件    例子用法:    gcc -c hello.c    他将生成.o的obj文件   -o           制定目标名称,缺省的时候,gcc 编译出来的文件是a.out -g          只是编译器,在编译的时候,产生调试信息。 -W  或-Wall       

why is this 588

【c语言】gcc编译动态库静态库使用说明

c语言gcc编译动态库静态库使用说明

hutaotaotao的博客 2932

Linux中gcc编译、静态库动态库的制作

Linux中gcc编译、静态库、动态库文章目录:1 gcc编译过程1.1 gcc编译过程1.2 gcc的常用参数2 gcc 静态库的制作2.1 静态库的制作流程2.2 静态库的优缺点3 gcc 动态库 / 共享库 的制作3.1 动态库 / 共享库的制作流程3.2 动态库查找不到解决方法3.3 动态库的优缺点 gcc是文本编译器,就是编译代码的工具,下面介绍gcc编译C语言(.c文件)的流程...

求真、务实 6755

GCC生成静态库动态库实例以及GCC编译工具集中各软件的用途

掌握GCC工具集ELF格式能够深入理解程序从源码到执行的完整过程,有效解决编译链接中的各种问题以及进行程序性能分析优化掌握Linux系统下的二进制文件分析,为后续学习操作系统、编译原理打下基础,这套知识体系是Linux C/C++开发工程师的核心技能,对于理解系统底层工作原理进行高效程序开发具有重要意义。类型:ET_EXEC4)共享目标文件 (.so)动态链接库文件类型:ET_DYN5)核心转储文件 (core)程序崩溃时的内存转储文件类型:ET_CORE。

2502_92895989的博客 1972

GCCgcc编译器使用

gcc编译器使用

weixin_50964793的博客 7853

GCC编译工具链全解析 含动态库与静态库

如果表达式的值为 0,则#if 与 #endif 之间的代码会在预处理阶段删除;否则,#if 与 #endif 之间的代码会被保留,交由编译器处理。仅当 DEBUG 被定义成宏时,#if #endif 之间的代码会保留到程序中。动态库之所以称为动态,是因为它在链接阶段并不会打包到可执行程序中,而是在程序运行的时候才加载的。它的作用恰恰与 #ifdef 相反:当标识符没有被定义成宏时,保留 #ifndef 与 #endif之间的代码。当链接时,有同名的静态库与动态库时,会默认与动态库进行链接。

m0_74696257的博客 1832

C++(GCC生成使用动态库

使用动态库的好处有以下几点: 1. 节省内存空间:动态库在程序运行时才会被加载,不会像静态库那样在编译时就被全部链接进可执行文件中,因此可以节省内存空间。 2. 便于更新:当动态库更新时,只需要替换动态库文件即可,不需要重新编译整个程序。 3. 提高程序运行效率:由于动态库可以被多个程序共享,因此可以减少内存中的重复代码,提高程序运行效率。 4. 方便程序的开发维护:动态库可以被多个程序共享,因此可以减少代码冗余,提高代码复用率,方便程序的开发维护。 5. 支持动态加载。

mahuifa的博客 4887

linux编译生成动态库、静态库,以及使用

一、介绍 在实际开发过程中,当代码的文件较多,可以将一部分代码编译动态库或者静态库然后再加载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库动态库的差异 1、链接静态库简单理解就是复制目标代码嵌入可执行文件中 2、动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本 3、动态库在程序运行时被链接,故程序的运行速度链接静态库的版本相比必然会打折扣 gcc总体选项列表 1) -c :指编译,不链接,生成目标文件“.o”。 2) -S :只编译,不汇编生成汇编代码“.S”。 3

锅锅的博客 9178

GCC 指令详解及动态库、静态库的使用

GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc、g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar、nm 等。GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C、Pascal、Fortran、Java、Ada 等语言均能进行编译

「 虚幻私塾」 5890

GCC编译GCC 使用中常用的参数及命令

【转载】gcc 使用中常用的参数及命令 本文转载自:http://www.cnblogs.com/yaozhongxiao/archive/2012/03/16/2400473.html 如需转载,请注明原始出处。谢谢。 ----------------------------------------------------------------...

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 6万+

gcc编译工具生成动态库静态库

gcc编译工具生成动态库静态库之一----介绍 1.库的分类 根据链接时期的不同,库又有静态库动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么) 2 静态库动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代

曾经的你 845

编译原理——汇编过程中gcc生成静态库动态库

在上一篇文章中,我们已经初步使用了虚拟机,并且已经体会过Ubuntu系统编译程序Windows系统编译程序的不同。在上一个实验中,我们利用GCC编译器完成了程序编译,但是即使我们已经没有使用IDE那样一键编译程序了,想要更加深入地了解程序编译的过程我们需要GCC背后的故事。通过本次实验我深刻体会到了文件汇编的过程,也逐渐对程序编译过程有了进一步的体会,它并不是像书上总结的短短的预处理、编译汇编那样一句话概括的过程,而是由多个工具的多种行为协调在一起才得以完成。

qq_53085291的博客 1850

gcc生成静态库.a动态库.so

gcc生成静态库.a动态库.so一、用gcc生成静态库动态库1、 hello实例2、实例一3、实例二二、总结三、参考资料 一、用gcc生成静态库动态库 1、 hello实例 2、实例一 3、实例二 二、总结 三、参考资料 ...

阿布巴的博客 2970

在Linux下如何使用GCC编译程序、简单生成静态库及动态库

在Linux下如何使用GCC编译程序、简单生成 静态库及动态库。<br />   本文适用于Linux下开发初学者。本文初步讲解在Linux下如何使用GCC编译程序、简单生成静态库及动态库。<br /><br /> 一、关于安装。一般系统默认是安装好编译器的,并且网络上有大量资料介绍不同发行版本下的安装问题,本文不再描述。<br /><br /> 二、C编程中的文件后缀名介绍<br />     .a 静态库(打包文件)<br />     .c 未经过预处理的C源码<br />     .

clozxy的专栏 1万+

gcc生成静态库动态库以及其文件的生成使用

gcc生成静态库动态库以及其文件的生成使用

qq_52362275的博客 2552
上一篇: 建立交叉编译环境
下一篇: linux 获取线程ID的方法
lb015331
博客等级 码龄19年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值