背景

在GCC中已经指定链接库,然而编译时却提示动态库函数未定义!

测试出现的错误提示如下:

[GMPY@13:48 tmp]$gcc -o test -L. -lmylib test.c

/tmp/ccysQZI3.o:在函数‘main’中:

test.c:(.text+0x1a):对‘func_lib’未定义的引用

collect2: error: ld returned 1 exit status

而在测试用的动态库libmylib.so中是有定义函数func_lib的

[GMPY@13:55 tmp]$cat mylib.c

#include

int func_lib(void)

{

printf("In share library\n");

return 0;

}

[GMPY@13:56 tmp]$gcc -fPIC -shared mylib.c -o libmylib.so

GCC的链接坑

此处的"坑"指对不熟悉GCC机制的童鞋而言,会出现无法理解的不符合预期的效果

在用gcc编译时,我们可以用-L指定链接库位置,用-l指定。

man gcc查询时,我发现这么一段描述:

-llibrary

-l library

... ## 这里为了方便阅读,对原文进行了换行排版优化

It makes a difference where in the command you write this option;

the linker searches and processes libraries and object files in the order they are specified.

Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o.

If bar.o refers to functions in z, those functions may not be loaded.

...

嗯,这段话什么意思呢? 如果-l链接库在源码之前,就会链接不到库!!

就像下面两个命令的差别:

异常:gcc -o test -L. -lmylib test.c

正常:gcc -o test -L. test.c -lmylib

竟然对执行时参数的位置都有要求,也是醉了

GCC的链接步骤

GCC是怎么样理解-l的呢?

A library is a collection (an archive) of object files. When you add a library using the -l option,

the linker does not unconditionally take all object files from the library. It only takes those object

files that are currently needed, i.e. files that resolve some currently unresolved (pending) symbols.

After that, the linker completely forgets about that library.

The list of pending symbols is continuously maintained by the linker as the linker processes input

object files, one after another from left to right. As it processes each object file, some symbols get

resolved and removed from the list, other newly discovered unresolved symbols get added to the list.

So, if you included some library by using -l, the linker uses that library to resolve as many currently

pending symbols as it can, and then completely forgets about that library. If it later suddenly

discovers that it now needs some additional object file(s) from that library, the linker will not "return"

to that library to retrieve those additional object files. It is already too late.

什么个意思呢?就是说,GCC链接器按下面的步骤链接文件:

从左往右链接源文件

在链接时,如果出现源文件调用了却没有定义的函数、变量等,则记录下来

如果遇到-l指定的库,则在库中尽可能检索所有记录下来的没有定义的函数、变量,只从库中提取用到的部分,其他完全抛弃

在全部链接完后,如果依然存在未定义的函数、变量,则报错

正因为GCC链接器的"始乱终弃",在检索-l的库后,就抛弃了这个库,后面还需要用时,自然就找不到了

GCC并不会回过头来检索之前链接过的库

从这样的链接步骤,我猜测还会有个特性:

由于GCC链接库会在首先指定的库中"贪婪匹配"所有未定义的函数、变量,因此,

即使两个库有相同的函数、变量的定义,只会使用最先找到的库中的定义

node中通过orm2链接mysql的一个坑

代码是orm上的例子,出现如下错误: ORMError: Connection protocol not supported - have you installed the database dri ...

Visual Studio 安装easyX且导入graphics库后,outtextxy提示未定义标示符

1.点击 “项目” ,然后点击 “属性”. 2. 然后点击左侧 “配置与属性” 下的 “常规” ,在点击 “字符集” ,选择 “使用多字节字符集” 即可解决问题

xamarin绑定原生库的一些坑

最近一个项目涉及到较多的第三方库的绑定技术,中间遇到了几个坑,记录下来与大家分享 绑定Jar库 monoandroid对原生库的调用都通过Android.Runtime.JNIEnv进行调入(http ...

Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# g ...

gcc链接g++编译生成的静态库和动态库的makefile示例

使用c++开发程序或者库时,将库提供给其他人使用. 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同. 首先是静态库,以链接g++编译生成的libmylib.a为 ...

g++/gcc 链接头文件 库 PATH

转自http://blog.csdn.net/kankan231/article/details/24243871 在Linux下编译链接或运行c/c++程序时可能会遇到找不到头文件,找不到库文件的错 ...

记前端状态管理库Akita中的一个坑

记状态管理库Akita中的一个坑 Akita是什么 Akita是一种基于RxJS的状态管理模式,它采用Flux中的多个数据存储和Redux中的不可变更新的思想,以及流数据的概念,来创建可观察的数据存储 ...

GCC链接的几个注意点

库文件依赖顺序 GCC在链接时对依赖库的顺序是敏感的,被依赖的库必须放在后面,比如liba.a依赖libb.a,必须写成liba.a libb.a,否则链接将出错.在库比较多依赖关系比较复杂或者相互依 ...

随机推荐

PhoneGap: Android 自定义组件

Hello Core Demo Plugin Development(组件部署): http://docs.phonegap.com/en/2.0.0/guide_plugin-development ...

nslog

今天有人问我怎么更好的使用nslog,打包的时候老注释 pch里加下面的代码就好了平时debug的时候打印,release后就不打印了 #ifdef DEBUG#define NSLog(...) N ...

i++为什么没有自增探析——JVM中i++的实现(转)

很多朋友在使用Java时候会发现一个很奇怪的现象. 那就是使用下列的短句时会发现i没有自增,这是很让人迷惑的,因为大家印象中,虽然i++优先级较低,但是总是会自增的,这里为什么i++没有自增? i=i ...

给 input 中 type="text" 设置CSS样式

input[type="text"], input[type="password"] {    border: 1px solid #ccc;    paddi ...

[设计模式] 3 创建者模式 builder

转载http://blog.csdn.net/wuzhekai1985/article/details/6667467 建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不 ...

OAuth 2.0介绍学习

OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0. OAuth 2.0关注客户端开发者的简易性.要么通过组织在资源拥有者和HTTP服务商之间的被批 ...

[Tools] Wireshark Primer Tutorials

介绍就不说了,安装也没必要讲,关于如何使用,网上的辣鸡文过多,视频又太冗余. 我推荐看下面有条理的入门教程. 界面说明:http://openmaniak.com/cn/wireshark_use.p ...

Docker入门 - 003 Docker 实例

Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob: ...

基于Vue的Quasar Framework 介绍 这个框架UI组件很全面

基于Vue的Quasar Framework 介绍 这个框架UI组件很全面 基于Vue的Quasar Framework 中文网http://www.quasarchs.com/ quasarfram ...

前端回顾:2016年 JavaScript 之星

JavasScript社区在创新的道路上开足了马力,曾经流行过的也许一个月之后就过时了.2016已经结束了.你可能会想你是否错过一些重要的东西?不用担心,让我们来回顾2016年前端有哪些主流.通过比较 ...

linux编译动态库未定义,GCC链接库的一个坑:动态库存在却提示未定义动态库的函数...相关推荐

  1. linux编译动态库未定义,linux 编译动态链接库 so,避免运行时才发现函数未 ......

    ldd  查看 elf文件依赖的  so 动态链接库 可以  export LD_LIBRARY_PATH=/path 设置 so文件的路径, nm  -u  *.so  或者 nm |grep  U ...

  2. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法

    自定义动态库 对'*'未定义的引用 本帖最后由 longruliang 于 2015-05-25 16:02:26 编辑 自己编写了一个串口方面的动态库,想写一个测试程序,在编译的时候冒出对'*'未定 ...

  3. python函数打上去说未定义_Python:名称未定义错误,即使函数被明确定义为b

    我是python新手,在函数定义方面有一个奇怪的问题.我已经检查了论坛,并确保在调用之前定义了我的函数,但是这并没有帮助解决问题.当我试图在这个特定的方法中按字面方式调用函数时,总是会遇到一个未定义名 ...

  4. mfc定义了变量仍提示未定义标识符_JavaScript-变量

    好好学习,天天向上 本章主要内容是:变量声明.命名规则.赋值 变量 变量(variables) 是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存 储的数据 变量相当于一个容器,内部可以存 ...

  5. RTL8198D 编译出现sk_pacing_shift_update未定义

    问题描述 在编译sdk的时候,出现sk_pacing_shift_update未定义问题,导致编译失败 问题分析 使用grep搜索内核发现没有定义,只有以下代码引用,所以问题是由于内核中没有定义引起的 ...

  6. g linux 未定义的引用_【转】 g++编译时对'xxxx'未定义的引用问题(undefined reference to)...

    转自:https://blog.csdn.net/killwho/article/details/53785910 引用:http://www.linuxdiyf.com/linux/16754.ht ...

  7. python调用js文件报错_python - selenium 运行网页中js脚本报错,提示未定义

    问 题 问题1 selenium 运行网易中js脚本报错提示未定义 报错提示如下: driver.execute_script("javascript:amsInit(62800,30315 ...

  8. php class variable,解决关于PHP“Undefined variable”变量未定义

    php中变量可以不定义的但是我们如果不对错误进行一些处理在使用未定义的变量时会提示Undefined variable错误了,下面我给大家举几个实例. PHP错误提示"Undefined v ...

  9. vue-cli项目在IE下运行钩子函数抛出异常“ReferenceError: “Promise”未定义“”的解决办法

    vue-cli项目在IE下运行钩子函数抛出异常"ReferenceError: "Promise"未定义""的解决办法 参考文章: (1)vue-cl ...

最新文章

  1. 资源文件相关学习总结
  2. 《JAVA与模式》之装饰模式
  3. [python]python字典
  4. c#图片上绘制半透明矩形
  5. 最新处理器排名_安兔兔Android处理器天梯榜发布:最强的还是它
  6. yearProgress.vue
  7. Litho在美团动态化方案MTFlexbox中的实践
  8. Java常用设计模式————享元模式
  9. 《中国人工智能学会通讯》——4.32 数据包丢失
  10. (九)OpenCV Canny边缘检测
  11. php正则表达式小括號,php使用正則表達式提取字符串中尖括號、小括號、中括號、大括號中的字符串...
  12. MTK平台上电话黑名单功能总结
  13. linux五笔教程,Linux 拼音五笔(或五笔拼音)输入法正确制作方法
  14. Rust 从入门到精通12-集合
  15. c#IntPtr简例
  16. 乐高大颗粒作品23:磁悬浮列车
  17. 您需要来自administrator 的权限才能对此文件进行更改
  18. 上财计算机专业全国排名,2021软科财经类大学排名,上海财经遥遥领先,东财仅排第六...
  19. Mentor-dft 学习笔记 day24-Path Definition File
  20. 3.4 数值分析: 迭代法的收敛性

热门文章

  1. Python获取excel数据
  2. c语言自动输入0到1000,c语言实现输入一组数自动从大到小排列
  3. 容器编排工具与 Kuberneters
  4. java常用代码架构示例
  5. 【opencv】Camshift目标跟踪
  6. 重构改善代码--代码的坏味道
  7. 5 python数据分析基础——批量进行数据分析(一)
  8. 对于表单提交的防止重复提交
  9. Java将查询到的List,list集合还嵌套一个list集合(把这个list集合和嵌套的list集合合并为一个list集合)
  10. P4学习笔记(三)P4编程语言简介