当前位置:  技术问答>linux和unix

GCC中静态连接和动态连接的区别(LINUX下)

    来源: 互联网  发布时间:2016-08-13

    本文导语:  最近正在学习库的用法,写了最基础的libmystring.a的库(里面只有一个add函数),然后编写test程序测试add函数,用ar命令创建好libmystring.a库后,用以下命令编译静态连接的a.out gcc –static test.c –L ./ –lmystring –o a...

最近正在学习库的用法,写了最基础的libmystring.a的库(里面只有一个add函数),然后编写test程序测试add函数,用ar命令创建好libmystring.a库后,用以下命令编译静态连接的a.out
gcc –static test.c –L ./ –lmystring –o a.out

得到静态连接的a.out,./a.out后得到想要的结果;
然后 rm a.out
gcc test.c –L ./ –lmystring –o a.out
得到动态连接的a.out,./a.out后得到想要的结果;
最后把libmystring.a删掉,再./a.out  想象中是不是应该报“找不到XX库的错误”什么之类的,但结果却还是正确的运行输出相应的结果。。。。这是为什么呢? 不是说动态连接的文件在运行的时候需要依赖库文件吗?  是我哪里理解错了呢?  
高手指教下!

如下是测试例子:(已经删除了.a库文件,运行a.out后还是输出正确的结果)
gfs@ubuntu:~/study/lib$ ls
a.out  mystring.c  mystring.h  mystring.o  test.c
gfs@ubuntu:~/study/lib$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
gfs@ubuntu:~/study/lib$ ./a.out

add=9


|
因为你给他的本来就是一个静态库。


静态库有静态库的用法,静态库是直接打包编译的。


你可以去看看如何使用动态库。

这里,他发现你给他的是一个静态库,他会把他打包编译到可执行文件中,

以后的运行都不依赖你给他的库文件了

|
LZ,你需要去看看库文件的原理,以及运作方式。

其实你加不加

-static,结果都是一样的。按照库文件的工作原理,他会先去搜索动态库文件,也即是.so结尾的库文件,

当他找不到动态的(.so文件)的时候,他就会去找静态的库文件,也就是.a结尾的文件。

你这个地方,没什么问题

其实就是库文件找不到动态库了,他就去找静态库,一旦找到,他就工作了



|
ar生成的libmysring.a是静态库.
gcc -shared -o libmstring.so mystring.o
生成的才是动态库。

gcc test.c –L ./ –lmystring –o a.out
会优先链接动态库,如果没有就用静态库。

|
GCC中静态连接和动态连接的区别(LINUX下)[图片]

你给他一个静态库,他就会用静态方式去连接,编译打包。


他不会把你的静态库转换成动态库的。

这个是原则。


|
GCC中静态连接和动态连接的区别(LINUX下)[图片]


LZ,这样给你说:你给他吃什么,他就吃什么。

动态连接来说,他是通吃的。只要你不是在程序中用代码使用动态库。

像你调用函数这种,不加static,他都可以吃的。

但是惟独动态的.so的时候,-static他吃不了。因为你的static已经限定了,你只能给我吃静态的 ,动态的他就不能吃。


如此。。以用-static的时候,给他喂一个.so的,他当然要拒绝了

|


很多库同时带静态(.a)和动态(.so)文件,而且放在同一个目录下,这个时候就需要-static指定用静态库,否则永远会优先使用动态库。

|
GCC中静态连接和动态连接的区别(LINUX下)[图片]

-static...


就是让你静态打包编译啊,很多情况下,你会发现,一个库文件,他既有动态库,也有静态库。

为了不依赖平台,我-static,当然就不会去使用.so了,不管你有没有动态库,方正我就只需要你的静态库就ok

你可以在/lib下看看,很多库,都是动态静态都有的。

    
 
 

您可能感兴趣的文章:

  • 关于 gcc 连接的问题...
  • AIX下gcc编译器怎么使用动态连接库
  • gcc连接共享库的问题
  • GCC连接出的是ELF还是A。OUT?
  • GCC连接出错了,怎么回事?
  • 用 gcc 或 ld 连接程序时,如何设置段的属性?
  • gcc 和g++分别编译出来的.o 再一起连接成可执行程序,是否有问题。
  • gcc的静态库.lib怎末在编译的时候连接。对了静态库是自己的???
  • gcc中连接器ld -r命令是什么作用
  • 在linux下用gcc编译时能不能实现“选择”的静态连接呢?
  • 在linux下如何用gcc连接远端Oracle数据库?(菜鸟提问,大虾快答)
  • GCC在UNIX下连接的一个问题,请高手帮忙看一下。
  • 请问一下,在gcc下如何连接多个文件,在线,特急。
  • ld用法:gcc 的连接器ld怎样连上.o文件
  • Ubuntu如何连接上网,网是广电网。或是,如何在不上网的情况下装gcc,g++编译器?
  • arm-linux-gcc的连接问题
  • gcc编译动态连接库一问
  • 为什么gcc可以连接archive中的多个同样的symbol,而没有报multiple definition?
  • Linux下gcc编译时,如何以静态链接的形式编译?
  • 请教一个gcc静态编译的问题。
  • 如何在gcc中调用静态库(.a)中的函数?谢谢!
  • gcc如何静态地调用 lstdc++库?
  • gcc 做一个动态库 要包含一个静态库
  • php iis7站长之家
  • gcc 非静态链接产生段错误
  • gcc静态链接的疑问
  • gcc 静态链接的问题
  • GCC中VMA和LMA在静态编译情况下是否相等?
  • 200分求解:程序中同时用到共享库(.so)、静态库(.a),编译时gcc的参数该如何设置?
  • GCC 编译使用动态链接库和静态链接库的方法
  • 【紧急求助】IBM AIX 4.3.3上用gcc 静态链接程序出错,不知为何?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一个gcc与动态库的问题
  • makefile中加入动态库编译,在gcc下正常,在arm gcc下说库找不到?
  • 使用gcc,如何在Solaris上生成so动态库文件?
  • GCC curses动态库链接的错误
  • 在Unix环境下用gcc如何编译成动态链接库文件?类似Windows下的DLL文件。
  • arm-linux-gcc 编译时加载<math.h>动态链接库的问题
  • 帮忙看看,gcc中 把所有的目标文件链接为动态库 的命令 错在哪里?
  • gcc能否为每个链接的动态库单独指定搜索路径和运行时路径呢
  • gcc动态链接库的问题
  • 自己编的动态库与应用程序必须使用一个(版本)gcc吗?
  • solaris上用gcc编译出的动态库老是无法找到导出函数
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 使用popen来执行gcc命令,如何根据读出来的gcc的输出来判断gcc是否编译成功?
  • 命令:mips_fp_le-gcc,mipsel-gcc 是什么意思?跟一般的gcc有什么区别?
  • 怎样升级我的GCC呀,我用的RH7.2,GCC 2.96 ,我从网上下载了一个gcc-3.2.3.tar.gz
  • arm-elf-gcc 和 arm-linux-gcc有什么区别?arm-elf-gcc里的elf代表什么?
  • gcc-ccore、avr-gcc及arm-gcc的区别
  • gcc在哪里?bash:gcc:command not found
  • 如何删掉GCC3.0(我需要GCC2.0-----)
  • Windows版GCC TDM-GCC
  • 急问:如何卸掉gcc 3.2庄gcc 2.96
  • 有人遇到过吗,在安装GCC时提示,"checking gcc ...no "
  • gcc编译时出错,gcc: installation problem, cannot exec `as': 没有那个文件或目录!!!求助呀呀!!!!!
  • GCC无法安装的问题,希望有人帮我( Debian 4.04ra无法安装GCC)
  • Solaris8,安装了iconv,gcc和gcclib,然后用gcc编译c程序出错。
  • 一套未安装gcc的Linux中安装gcc rpm包时时出现错误
  • gcc与arm-linux-gcc编译的问题???
  • 下了一个GCC3.0包用tar xjfv gcc-3.0.tar.bz2解压后出现一堆文
  • 请问如何安装rpm格式的gcc如gcc-3.2.2-5.src.rpm,谢谢
  • arm-linux-gcc交叉编译出错,但gcc编译没错,什么原因呢???
  • 在redhat9下,如何将gcc3.x改为gcc2.x?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3