求大神,linux下静态库链接的问题
有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件,有下面几种操作方式
1、直接编译生成a.o, b.o,然后链接libh.a,没有问题,正常
2、将b.c打包成库libb.a,然后编译生成a.o,然后链接libh.a,libb.a,则a.o,libb.a, libh,a能链接通过,没有问题,正常
现在的问题是不链接libh.a,问题来了
1、直接编译生成a.o, b.o,然后链接则会报错,说FUNC1找不到
2、将b.c打包成库libb.a,然后编译生成a.o,然后链接libb.a,则有两种情况
1)如果a.c中不调用b.c中的函数,则能链接通过并生成执行文件,
2)如果a.c中有调用b.c中的函数FUNC2,同链接不能通过。
不知道三种情况下,为什么a.c中调不调libb.a中的函数会有两种不同的表现?难道不调用libb.a中的函数的时候,libb.a就不会去链接libh.a吗?求解

linux 链接 静态库

------解决方案--------------------
静态库中没有内容被引用的 .o 文件是不会参与链接的。

转自:http://www.myexception.cn/c/1170327.html

=============== Elta的分割线 ================

这个错误最近经常出现,而且让人一头雾水。找到的这个答案讲解的也很清楚了。

其实就是:如果有两个链接库,一个用到了另外一个的函数,而链接用的.o文件却没有用到这个函数,那么这个函数是不会被链接通过的。

linux上静态库链接的有关问题的更多相关文章

  1. Linux上静态库和动态库的编译和使用

    linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...

  2. linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

    主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...

  3. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...

  4. [转帖]Linux 的静态库与动态库

    Linux下的静态库与动态库 2017年02月18日 09:17:13 LLZK_ 阅读数:10257 标签: linux动态库静态库区别使用 更多 个人分类: Linux学习笔记 所属专栏: Lin ...

  5. linux下静态库和动态库一些东西

    http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux  动态链接库和静态库示例 文件预览 文件目录树如下, ...

  6. linux下静态库的制作

     在我们编写软件的过程当中,少不了需要使用别人的库函数.因为大家知道,软件是一个协作的工程.作为个人来讲,你不可能一个人完成所有的工作.另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把 ...

  7. 深入理解LINUX下动态库链接器/加载器ld-linux.so.2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

  8. Linux 使用静态库注意事项

    1. 静态库一定要放在生成文件后面 gcc main.c -o main libhello.a 2. 使用静态库时一定要连接所有用到的静态库 gcc main.c -o main liba.a lib ...

  9. 自己在linux上编译、链接、动态库和静态库的学习笔记

    在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...

随机推荐

  1. nexus 中央仓库

    nexus 中央仓库 下载地址:http://www.sonatype.org/nexus/archived 下载最新版本 mkdir -p /opt/local/nexus tar zxvf nex ...

  2. SSH使用TCP Wrappers实现访问控制

    SSH使用TCP Wrappers实现访问控制主要配置文件/etc/hosts.allow/etc/hosts.deny===TCP Wrappers的访问控制原则首先检查 hosts.allow 文 ...

  3. Apache2 MPM 模式了解

    一.MPM MPM(Multi-Processing Module (MPM) implements a hybrid multi-process multi-threaded server)是Apa ...

  4. iOS开发——判断是否第一次启动

    在我们做项目的时候,判断是否是第一次启动,还是比较常用的,比如,欢迎界面,只是第一次启动需要的调查问卷等等,目的明确,方法很多,这里介绍一种简单的. 在你需要只有第一次启动才跳转的地方写上 if(![ ...

  5. iOS Socket第三方开源类库 ----AsyncSocket

    假如你也是一个java程序员,而你又不是很懂Socket. 下面我的这篇文章也许能帮助你一些. http://xiva.iteye.com/blog/993336 首先我们写好上面文章中的server ...

  6. RoundedImageView使用吐槽心得(RoundedImageView与Glide加载图片,第一次加载无法圆角问题)

    最近使用的时候发现一个问题, RoundedImageView与Glide搭配使用的时候,第一次加载图片(内存中没有),后图片无法圆角,后来尝试各种改,最后想到了一个办法,就是让Glide加载图片的 ...

  7. Insert Select

    有三种用法 1.insert  values 2.insert select 3.inser exec

  8. javascript AOP

    Function.prototype.bind = function(b) { var a = this; return function() { a.apply(b, arguments) } }; ...

  9. Jquery Validate 动态添加校验

    <cx:script> <script type="text/javascript"> //修改表单验证,提交 $(document).ready(func ...

  10. animate的{queue:false,duration:400}意思

    示例:$(document).ready(function(){ $('.tmplS').hover(function(){ $(".cover", this).stop().an ...