对于我这个刚入IT行业不就得新手来说,在linux下链接库的时候总是会遇到各种各样奇葩的问题,最多的就是“undefined reference to”和“cannot find”这两类,层出不穷,总是在我即将完成工作的时候给我当头一棒,让我欲罢不能。这不,这几天编译linux下一个项目时又遇到难题了。

在我编译的项目中,其中需要编译一个静态库(下面命名为libA.a),而libA.a需要依赖另外两个动态库(下面命名为libB.so和libC.so),刚开始在编译libA.a时,提示找不到libB.so和libC.so里面的函数接口。然后看了一下Makefile,便发现了原因。这个不难。原来是我只在由.o文件连接成.a文件时有链接了libB.so和libC.so动态库,但是在由.c编译成.o时并没有链接libB.so和libC.so。所以这一步直接提示找不到动态库里面的函数接口。按照上面的错误原因修改Makefile之后,便轻易地编译成功了。

就在我以为一切都大功告成的时候,我才发现我又高兴的太早了。当我将编译好的libA.a以及它所依赖的libB.so和libC.so都连接在项目中时(像我一样的新手千万别忘了,这个依赖的是动态库,要连同一起连接在项目中,我就吃过亏),编译出现的错误,错误内容还是“undefined reference to”libB.so和libC.so里面的函数接口。我当时就蒙了,这是什么情况,我明明都链接进去了啊,为什么还是这样。从错误的提示内容可以看出libA.a里面的函数接口都正常,唯独libB.so和libC.so他们两个里面的函数接口找不到。我就怀疑是不是没有找到这两个动态库或者链接出错之类的,折腾了一会我发现我又错了,如果没链接成功会有类似“cannot find”之类的提示。所以说链是链接上了,可为什么还是找不到呢。就在我百思不得其解时,突然一个念头从脑海中闪过“顺序”,难道问题是出在我连接库的顺序上?当前的顺序是先连接的libB.so和libC.so,然后再链接libA.a。于是我抱着一丝希望将libA.a调到了libB.so和libC.so两个前面,先连接libA.a,运行make。。。真TM编过了。哎,看来真的是年轻啊。

至于为什么会这样,在这就不多废话了,有兴趣的码友可以专门去了解一下。

最近遇到个低级错误,记录一下,在linux下生成静态库时报“ar: 给出了两个不同的操作选项”错误

最后发现是因为我在生成静态库时把该静态库依赖的库也加上了,如下

ar -r libzlog.a format.o level.o  -lpthread

其中-lpthread是不能写在这的,这句话应该改成ar -r libzlog.a format.o level.o,最后谁用libzlog.a谁添加-lpthread

linux下编译自己的静态库时依赖其他的动态库,使用时出现“undefined reference to”相关推荐

  1. 查看linux下程序或者动态库到底依赖哪些so动态库以及对应的版本

    一. ldd命令 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls linux-vdso.so.1 => (0x00 ...

  2. 【错误记录】360 加固后的运行错误 ( 加固 SO 动态库时不能对第三方动态库进行加固 )

    文章目录 一.加固 SO 动态库报错 二.解决方案 一.加固 SO 动态库报错 在 [Android 安全]使用 360 加固宝加固应用 ( 购买高级加固服务 | 设置资源加固 | 设置 SO 文件保 ...

  3. linux下的动态链接库和静态链接库到底是个什么鬼?(一)静态链接库的编译与使用...

    知识不等于技术,这句话真的是越工作的时间长越深有体会,学习到的知识只有不断的实践,才成真正在自已的心里扎下根,成为自身的一部分,所以无论如何,我希望我的博客可以一直写下去,慢慢的沉淀,终会有回报,无聊 ...

  4. 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用

    如有错误,欢迎大家指正,感谢! ​​​​​​​目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...

  5. Linux下用gcc生成静态库和动态库及练习使用OpenCV

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为 静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  6. linux下编译libuv,linux下libuv库安装教程

    下载并编译libuv libuv需要自己手动下载源码,并手动编译. 当前目录为:/home/xlz/test/github/,在后面,会用$PATH来代替,我的系统的Debian8,64bit. $g ...

  7. 在linux 下编译c程序时“ error:dereferencing pointer to incomplete type”的问题

    在linux 下编译c程序时经常会遇到" error:dereferencing pointer to incomplete type"的问题,该问题的原因是:结构体定义不规范造成 ...

  8. Git下载代码到Windows再拷贝到Linux下编译时要关闭换行符自动转换

    Git下载代码到Windows再拷贝到Linux下编译时要关闭换行符自动转换 一.各操作系统下文件换行符 二.TortoiseGit下载Github代码关闭文件换行符 三.示例说明 1.开启换行符自动 ...

  9. linux如何编译boost指定库,linux下编译安装boost库

    linux下编译安装boost库 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15 UTC 2015 x ...

最新文章

  1. 如何通俗的理解面向对象编程
  2. python字典按value逆序排序_python 对字典按照value进行排序的方法
  3. 怎样学好python-怎样学好python
  4. Hadoop自带的一些程序示例
  5. UVA 10273 Eat or not to Eat?
  6. python字符串讲解
  7. C#中OpenFileDialog获取文件名和文件路径的常用方法.
  8. spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定
  9. 怎么修改php.in的时间,PHP时间和日期函数怎么操作
  10. 如何避免成为新技术背后的“奶嘴一族”
  11. 【LeetCode】剑指 Offer 64. 求1+2+…+n
  12. 数字化风控全流程 实操课程V2.0 第三期
  13. 内置Jetty配置JSP支持过程中的常见报错
  14. 频谱仪使用方法图解_安全继电器工作原理、接线图、使用方法图解
  15. Linux终端下输出二维码
  16. android 车牌自动识别,Android端车牌识别可以用来实现摄像头扫描识别车牌?
  17. nn.module 看图搭建网络
  18. MATLAB课设代做在哪儿找,代写Grid World作业、代做CID留学生作业、代写Matlab课程设计、代做Matlab编程实验作业...
  19. app store android退款,买完 App、游戏内购就后悔了?手把手教你如何申请 App Store 退款...
  20. Python不用声明变量吗

热门文章

  1. 网上认证航天信息认证服务器设置,进项发票抵扣联的认证系统、方法及对应的客户端与应用服务器...
  2. python列表两两相减_用Python做打字软件,让你的打字快如闪电!附超详解和源码链接
  3. PS 宋体 12号 有锯齿 的问题
  4. mysql如何实现隔离性_Mysql的隔离以及实现
  5. bzoj 2732 射箭 半平面交 解题报告
  6. inode网卡被禁用解决方法
  7. 十个 C++ 运算符重载示例,看完不懂打我...
  8. mitmproxy USB: usb_device_handl问题
  9. contrast matlab,Matlab基本函数-contrast函数
  10. android闹钟测评,谁才是轻便实用好闹钟Android闹钟类应用横评