首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么即使nm找到了符号,链接也会失败?

即使找到了符号,链接仍然可能失败的原因有以下几点:

  1. 符号未定义:链接失败可能是因为找到了符号,但该符号在目标文件或库文件中未定义。这可能是由于编译器选项、库文件缺失或版本不匹配等原因导致的。
  2. 符号重复定义:链接失败可能是因为找到了多个定义相同的符号。这可能是由于多个目标文件或库文件中都定义了相同的符号,导致链接器无法确定使用哪个定义。
  3. 符号冲突:链接失败可能是因为找到了多个定义不同但名称相同的符号。这可能是由于不同的目标文件或库文件中定义了相同名称的符号,但其定义不一致,导致链接器无法解决冲突。
  4. 符号不可访问:链接失败可能是因为找到了符号,但该符号的访问权限不足。这可能是由于符号被声明为私有或受保护,而链接器无法访问到该符号。
  5. 符号依赖缺失:链接失败可能是因为找到了符号,但该符号所依赖的其他符号缺失。这可能是由于目标文件或库文件中缺失了符号的依赖项,导致链接器无法解析符号的所有依赖关系。

在解决链接失败的问题时,可以采取以下措施:

  1. 检查编译选项:确保编译选项正确设置,包括正确的库文件路径、版本匹配等。
  2. 检查库文件:确认所需的库文件存在,并且与编译器和链接器使用的版本匹配。
  3. 解决符号冲突:如果存在符号冲突,可以通过修改代码或使用命名空间等方式解决。
  4. 检查符号访问权限:确保符号的访问权限设置正确,如果需要访问私有或受保护的符号,可以考虑使用友元或访问器等方式进行访问。
  5. 解决符号依赖缺失:检查符号的依赖关系,确保所有依赖项都可用,并正确设置库文件路径等。

需要注意的是,以上解决方法是一般性的建议,具体情况可能因编程语言、开发环境和具体代码实现而有所不同。对于具体的链接失败问题,需要结合具体情况进行分析和解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++如何调用写好的C接口?

那么g++编译器为什么找不到print(int,int)呢,其实在我们学C++重载的时候就提到过C++底层的编译原理。...原因分析 test.c我们使用的是C语言的编译器gcc进行编译的,其中的函数print编译之后,在符号表中的名字为 print,通过nm查看.o文件. $ gcc -c test.c $ nm test.o...g++ 进行链接,也就是 C++ 链接方式,程序在运行到调用 print 函数的代码时,会在符号表中寻找 _Z5printii(是按照C++的链接方法来寻找的,所以是 _Z5printii 而不是...print)的名字,发现找不到,所以提示“未定义的引用” $ g++ -c test.c $ ls main.cpp makefile test.c test.h test.o $ nm test.o...总结 编译后底层解析的符号不同,C语言是 _print,C++是 __Z5printii 解决调用失败问题 修改test.h文件 #ifndef _TEST_H #define _TEST_H extern

1.1K10

C++中是如何调用C接口的?

你可能奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。 C++如何调用C接口 为什么会有这样的情况呢?...为什么找不到呢?现在你还会认为C++直接就可以调用C接口了吗? 真相 我们都知道,C++中函数支持重载,而C并不支持。...我们看看两个文件里的函数符号有什么区别: $ nm test.o|grep testCfun 0000000000000000 T testCfun $ nm main.o|grep testCfun...博客:https://www.yanbinghu.com 问题 为什么我们在C++代码中可以直接调用一些标准C库函数呢?即使你在main函数中调用printf等函数,它也不会出现链接错误。...如果你还是不确定,你可以先预处理: $ g++ -E main.i main.cpp 去生成的main.i文件中,是不是有extern "C"。

1.2K30

c和fortran混编

这正是因为链接器(链接器其实 是ld,gcc调用了它)在foo.o中找到了main.o中需要的foo的定义,并且在main.o中找到了main的定义。...main.c中调用了函数FOO,那么他编译出的这个函数的符号还是FOO, 这样对函数FOO的供与求才能对的上,链接器能找到对得上的符号才能链接成功。...有人说foo.o里还有一个未定义符号printf,这个到哪里去 ?gcc总是会有很多默认链接的库和链接选项,这其中包括c的标准库,而printf就在c标准库中。...这也就是为什么时常有人问gcc main.cc会出错的问题了,如果main.cc用到了c++库中的函数,那么当然要使用gcc -lstdc++ main.cc才行了) 如果我们保持main.c不变,...还有些程序会使用动态链接库.so,那么应该使用nm的-D选项查看这些动态符号

1.5K41

C++中是如何调用C接口的?

你可能奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。 C++如何调用C接口 为什么会有这样的情况呢?...为什么找不到呢?现在你还会认为C++直接就可以调用C接口了吗? 真相 我们都知道,C++中函数支持重载,而C并不支持。...我们看看两个文件里的函数符号有什么区别: $ nm test.o|grep testCfun 0000000000000000 T testCfun $ nm main.o|grep testCfun...博客:https://www.yanbinghu.com 问题 为什么我们在C++代码中可以直接调用一些标准C库函数呢?即使你在main函数中调用printf等函数,它也不会出现链接错误。...如果你还是不确定,你可以先预处理: $ g++ -E main.i main.cpp 去生成的main.i文件中,是不是有extern "C"。

1.4K10

万万没想到,一个可执行文件原来包含了这么多信息!

nm主要用于查看elf文件的符号表信息。...有符号表吗 我们都知道,没有符号表的程序,在core之后是没有太多有效信息可看的,也是无法使用gdb正常调试的,这个在《GDB调试入门,看这篇就够了》中已经有提到了,那么怎么看有没有符号表呢?...$ strip main 这个时候再看看: $ nm main no main symbols 程序占用空间太大? 为什么程序的占用空间这么大?...看起来并没有多少,如果这里占用空间过大,那可能是你程序中用到了太多的全局变量和静态变量或常量。当然了,如果你的全局变量都是初始化为0的,那么data这里是不会有明显的变化的(为什么?)。...看到了吗?我们的hello,字符串放在了这里。 总结 本文仅列出了一些比较常见的可执行文中能读到的信息,欢迎补充。 思考 对于a和b,它们的内存存储区域是一样的吗?为什么

63920

函数或全局变量重复定义时会怎样?

这又是为什么呢? 符号 在说明今天重点分享的内容之前,先简单了解一下什么是符号。在《hello程序是如何变成可执行文件的》中讲到过,ELF文件生成的最后阶段会经历链接,而链接阶段正是基于符号才能完成。...每个目标文件都会有一个符号表。而链接过程正是通过符号表中的符号,将不同的目标文件“粘”在一起,形成最后的库或者可执行文件。...通过nm命令就可以查看符号信息,这里就有我们的func_symbol函数和全局变量symbol的符号。...当然可以通过 __attribute__((weak)) 来定义一个强符号为弱符号。...对于多重定义,即标题提到的变量重名时,链接器有它的处理规则: 1.强符号不允许重复 2.有一个强符号和多个弱符号,使用强符号 3.多个弱符号,则随意选择一个 关于第一点,在最开始的例子中你已经见到了,最常见的情况就是你重复定义了变量或者函数等等

1.7K30

Xcode 单步调试 WebRTC

生成的静态库没有符号表 如何判断是否是由于没有符号表导致无法单步调试的呢?我们在 Linux 下经常用下面这个命令: nm : 显示二进制目标文件的符号表。...一般的用法是 nm 可执行文件/库文件 | grep 函数名 该命令不光可以在 Linux 上使用,在 Mac 上同样可以使用。如果通过上面的方法查不到相的函数名,那么说明程序里就没有符号表。...如何解决没有符号表的问题呢?学过编译原理的同学们都知道,程序在编译的时候必须要有符号表的。因为在生成可执行程序之前的链接阶段,需要通过符号表进行最终的地址定位与程序链接。...在调试时,debugger高亮显示你所执行的代码行,并且你可以看到对应该行的各种变量的值。那么debugger是如何做到的呢?它就是通过一张映射表做到的这种效果。...目前这类问题还没有找到更好的解决办法,所以对于这类问题处理的方式很简单,重建一个新的工程就好了。 小结 上面是我在工作中遇到的一个问题。无法对项目进行单步调试,严重的影响到了我们解决问题的进度。

2.8K60

程序一定要从main函数开始运行吗?

可以查看需要重定位的符号nm -u test.o U _GLOBAL_OFFSET_TABLE_ U puts 对于UND类型...如何指定程序入口 在ld链接过程中使用-e参数可以指定程序入口,由于一段简短的printf函数其实都依赖了好多个链接库,我们不太方便使用链接脚本将目标文件与所有这些依赖库进行链接,所以使用下面这段内嵌汇编的程序来打印一段字符串...,这段程序不依赖任何链接库就可以打印出字符串内容,读者如果不懂其中的含义不用担心,只需要了解下面介绍的链接知识就好。...: ar rcs libxxx.a xx1.o xx2.o 打包静态链接库 ar -t libc.a 查看静态链接库里都有什么目标文件 ar -x libc.a 解压所有的目标文件到当前目录 gcc...-a 显示所有的符号 nm -D 显示动态符号 nm -u 仅显示没有定义的外部符号 nm -defined-only 仅显示定义的符号 关于符号的说明: 如果符号类型是小写的,表明符号是局部符号

1.2K30

动态库

查看一个符号为什么活着 -Xlinker -why_live -Xlinker _global_function 调用脚本查看打印信息 build 动态库.dylib.framework编译链接详解...-> 去哪个路径下frameworks -> 也就是-F OTHER_LDFLAGS -> 要连接库的名称 -> 也就是-framework 上面参数主要目的是 -> 告诉程序导出符号在哪里 tdb...格式的讲解(请看下方tdb格式说明) -> 动态库在链接的时候, 只需要知道你所需符号所在的一个位置就行,不需要知道源码. -> 错误之所以存在就是链接的时候没有问题, 在运行的时候找不到了 动态库与framework...去查看命令参数, 上面是有关framework, -l相关的是 -reexport -lx 查看中间层的导出符号 -> nm -m 注意: 中间层的 -> LC_REEXPORT_DYLIB...动态库比静态库分发体积要小, 给别人提供SDK的时候,要考虑SDK的体积,虽然别人使用的时候让别人的IPA包变大. 可以更好的控制动态库里面符号的可见性

1.1K30

UI 设计中的视觉无障碍设计

然而为什么模拟器模拟成这种图片?因为不可能找到真正能模拟色盲的模拟方法。 是的——没有真正的色盲模拟器,这只是正常三色视觉者臆想出来的照片! 那么,他们眼中的世界到底是怎样?只能想象!...鸟类四种不同的视锥细胞,其主要感受黄、青、蓝和紫外,感受峰值分别是 565nm、508nm、440nm、370nm。...UI 设计中的视觉无障碍设计 作为三色视觉的程序员和设计师,刚刚我们想象了一把双色视觉的色盲世界,又被四色视觉的异人逼着看叶子的形状草体验了一把当色盲的感觉。...但如果我们增加一点符号显示,或者在公式旁边放上文字提示(其中一种就够了),这样的问题就能立刻解决。比如这样: ? 这时再模拟,能清楚地找到错误的公式: ?...▲ 色盲模拟器模拟的输入框验证 2 另外,前面我标注人类、鸟类和异人的波长点用的是符号而不是颜色。在制作图表的时候,通常应该考虑使用符号代替颜色。

1.4K20

链接加载原理及ELF文件格式

原理概述 为什么要研究链接和加载?写一个小的main函数用户态程序,或者是一个小的内核态驱动ko,都非常简单。...因为符号值改变的时候,需要对所有引用符号的地方的代码进行修改,所以需要还有一张表来记录符号表的引用关系,这就是重定位表: 从上图可见,重定位表项用来记录链接和加载的过程中需要重新定位的位置,在各个段位置发生改变而引起符号地址改变时...链接的重定位是通过重定位表直接修改代码来完成的,但是代码在运行过程中再去修改代码带来很多问题和风险。...但是为了实现动态链接的特性,即使用的时候才链接,不使用时可以不用链接,对外部代码的访问引入了一个新的表项PLT。...b.nmnm file“读出elf文件的符号表信息。 c.objdump “objdump –d file“反汇编出elf文件中包含可执行代码的section,elf命令中功能最强大的一个。

1.1K20

程序员C语言快速上手——工程篇(十二)

链接与库 前言 虚拟内存 总结 理解链接 C程序编译的四个阶段 预处理器 编译器 汇编器 链接器 总结 什么是链接 查看符号表 *拓展:nm命令查看符号类型 静态链接 函数库 静态库 打包静态库 链接静态库...为什么编译之后还要链接?什么是动态库什么又是静态库? 大家是否曾和我有过一样的疑问呢?...即使两个程序操作了一个相同的内存地址不会冲突,因为程序操作的都是虚拟地址,操作系统可以根据这两个程序不同的进程,分别将两个相同的虚拟地址映射到不同的物理地址中储存。...但是目标文件是不完整的,可以理解为瑕疵品,最后还需要链接器画龙点睛。 又有人疑问了,C语言不能直接翻译成机器语言二进制指令吗?为什么非得经过汇编语言转接一次呢?...使用objdump命令可以查看objdump -t calc.o、objdump -t main.o *拓展:nm命令查看符号类型 以下为常见符号类型,非全部。

1.3K20

正则表达式介绍与使用

为什么使用正则表达式? 答:典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。...虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性若采用这种方法搜索动态文本,即使不是不可能至少变得很困难。...[0-9]|2[0-3]):[0-5][0-9] 注意事项: 所有特殊字符在字符集中都失去原有的特殊含义,在字符集中如果要使用] - ^ 等符号需要在前面加上的一个转义字符; 一个字符组即使排除型字符组...\nm 标识一个八进制转义值或一个向后引用 #如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。...将匹配八进制转义值nm \nml 就是三位数的八进制表示Ascll \un 例如\u00A9匹配版权符号(©),用十六进制表示的Unicode ?

1K10

正则表达式介绍与使用

为什么使用正则表达式? 答:典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。...虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性若采用这种方法搜索动态文本,即使不是不可能至少变得很困难。...[0-9]|2[0-3]):[0-5][0-9] 注意事项: 所有特殊字符在字符集中都失去原有的特殊含义,在字符集中如果要使用] - ^ 等符号需要在前面加上的一个转义字符; 一个字符组即使排除型字符组...\nm 标识一个八进制转义值或一个向后引用 #如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。...将匹配八进制转义值nm \nml 就是三位数的八进制表示Ascll \un 例如\u00A9匹配版权符号(©),用十六进制表示的Unicode WeiyiGeek.进制 (?

1.2K20

【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】一、FFmpeg so库编译

不了解每个配置项的意义,即使好运配置对了, 但是稍微一修改,又无法正常编译了。 为什么FFmpeg让人觉得很难搞? 我想主要是因为迈出第一步就很困难,连so库都编译不出来,后面的都是扯淡了。...一点疑问 在使用最新的 ndk r20b 版本进行编译的时候发现,即使不配置 sysroot 可以正常编译,怀疑 Android 的 clang 工具是否经过了处理,自动去寻找对应的路径。...说到 sysroot 就不得不提到另外一个参数 -isysyroot ,这个参数让我困惑了很久,因为很少文章提到这个两个参数的联系和区别,然而这个参数很导致让人很莫名奇妙的编译失败。...仔细想想会发现,为什么当 cc 配置为下边的值时,可以正常编译呢?...ar nm 路径前缀是一样的,但是 Android NDK 的路径却是这样的 NDK clang路径 看到了不?

1.8K30

骚操作:利用强弱符号制作插件库

在《什么是强符号和弱符号》中简单介绍了强弱符号,那么强弱符号的性质有什么用呢? 还记得在《什么是强符号和弱符号》中提到的链接原则吗?...通俗一点说: 当没有插件时,使用默认行为 链接了插件时,使用插件的功能 原理和示例 其原理非常简单: 外部引用弱符号 如果符号地址为0,则说明外部没有链接插件库,未有强符号,走默认流程 如果符号地址不为.../main this is weak print 观察可执行文件: $ nm main |grep my_print w my_print 通过nm命令我们可以知道test_print...最终我们可以通过nm命令看到my_print符号已经不再是W了。也就看到了最后: this is plugin print 的打印了。...: 1.这一点在《什么是强符号和弱符号》一文中已经有解释说明了 2.在开始的程序中,即便没有链接插件库,程序可以正常编译链接通过,而不会报错 3.没有链接插件库时,由于其函数地址为0,因此,我们程序内判断

40910

有人在我列出成本后,打消了自研芯片的念头

毕竟风险更高,一点流片失败,大笔钱流片费就打了水漂。 既然芯片行业门槛这么高,为什么很多系统企业打算入局芯片设计,我认为主要有以下的考虑。一是,芯片自主可控。...采用先进工艺一般都是因为应用上性能要求高,因此设计上难度不会低。其次,先进工艺mask费用贵,这个是费用大头,估计会占到NRE成本的一半以上。再次,先进工艺的IP很贵。为什么贵?...但是为什么说现在做芯片的门槛降低了呢?因为绝大多数应用,只是完成一些控制以及连接的功能,并不需要非常高的性能。这类芯片,并不需要非常先进的制程,甚至28nm都用不上,40nm,55nm都足够用。...相关IP并不贵。找到靠谱的团队来定制一颗,千万以内就足以覆盖所有成本。 当年小米做芯片为什么失败,他们以为做芯片很容易,但是偏偏做了最难的,成本最高的手机芯片。...看看现在OPPO即便投入数百亿,只能先从自研ISP芯片开始。可见小米当年是多么轻敌。我很好奇,当年雷军的顾问是谁?

22420

动态库详解

查看一个符号为什么活着 -Xlinker -why_live -Xlinker _global_function 调用脚本查看打印信息 build 动态库.dylib.framework编译链接详解...链接动态的时候, 到底用到了什么东西 LoginApp 使用SYCSSColor动态库 xcconfig -> 告诉程序HEADER_SEARCH_PATHS -> 也就是-I的参数 FRAMEWORK_SEARCH_PATHS...-> 去哪个路径下frameworks -> 也就是-F OTHER_LDFLAGS -> 要连接库的名称 -> 也就是-framework 上面参数主要目的是 -> 告诉程序导出符号在哪里 tdb...格式的讲解(请看下方tdb格式说明) -> 动态库在链接的时候, 只需要知道你所需符号所在的一个位置就行,不需要知道源码. -> 错误之所以存在就是链接的时候没有问题, 在运行的时候找不到了 动态库与framework...去查看命令参数, 上面是有关framework, -l相关的是 -reexport -lx 查看中间层的导出符号 -> nm -m 注意: 中间层的 -> LC_REEXPORT_DYLIB

84620
领券