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

Nm在共享库中显示符号,但链接时未定义符号

在编译和链接过程中,当一个程序引用了一个函数或变量,但在链接时找不到该函数或变量的定义时,就会出现"未定义符号"的错误。而"在共享库中显示符号,但链接时未定义符号"则表示在共享库中存在对应的符号,但在链接时仍然无法找到其定义。

这种情况可能发生在以下几种情况下:

  1. 编译器或链接器版本不兼容:不同版本的编译器或链接器对于符号的处理方式可能有所不同,导致在链接时无法找到符号的定义。解决方法是确保使用相同版本的编译器和链接器进行编译和链接。
  2. 缺少依赖库:共享库通常依赖于其他的库文件,如果缺少了这些依赖库,就会导致链接时无法找到符号的定义。解决方法是安装或配置相应的依赖库。
  3. 编译选项错误:在编译时,可能没有正确地指定共享库的路径或链接选项,导致链接时无法找到符号的定义。解决方法是检查编译选项,确保正确地指定了共享库的路径和链接选项。
  4. 符号命名冲突:如果在程序中存在相同名称的函数或变量,就会导致链接时无法确定具体使用哪个定义,从而出现未定义符号的错误。解决方法是修改程序中的符号名称,避免命名冲突。

对于解决"在共享库中显示符号,但链接时未定义符号"的具体方法,需要根据具体的编译和链接环境进行调试和排查。在腾讯云的云计算平台中,可以使用腾讯云提供的开发工具和服务来进行编译和链接,例如使用腾讯云的云服务器(CVM)进行开发和调试,使用腾讯云的云原生服务(TKE)进行容器化部署,使用腾讯云的云函数(SCF)进行无服务器开发等。具体的产品和服务介绍可以参考腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

Linux命令(63)——nm

1.命令简介 nm命令是GNU Binutils二进制工具集的一员,用于显示目标文件符号。如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。 nm命令显示符号类型。...对于这样的符号,动态链接器将确保整个过程只有一个使用此名称和类型的符号。 U 该符号在当前文件未定义的,即该符号定义别的文件。...对于全局变量来说,定义它的文件,其符号类型为B或D,使用它的文件,其类型为U。 v,V 该符号是一个弱符号。当弱定义符号与正常定义符号链接,使用正常定义符号不会出错。...当弱定义符号与正常定义符号链接,使用正常定义符号不会出错。当链接未定义的弱未定义符号,该符号的值将以系统特定的方式确定,且不会出错。...该任选项仅对于动态目标(例如特定类型的共享)有意义 -f|--format=:format可以选取bsd、sysv或posix,该选项GNU的nm中有用,默认为bsd

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

    链接就是把相似的段放在一起,先找到段的偏移地址,再找出符号的偏移,这样可以确定符号整个可执行程序的地址。...,这种未定义符号都是因为该目标文件中有关于他们的重定位项,链接器扫描完所有的输入目标文件后,所有这种未定义符号都应该能在全局符号表中找到,否则报符号未定义错误。...有一个编译选项叫函数级别链接,可以使得某个函数或变量单独保存在一个段里面,都链接器需要用到某个函数,就将它合并到输出文件,对于没用到的函数则将他们抛弃,减少空间浪费,这会减慢编译和链接过程,GCC...-a 显示所有的符号 nm -D 显示动态符号 nm -u 仅显示没有定义的外部符号 nm -defined-only 仅显示定义的符号 关于符号的说明: 如果符号类型是小写的,表明符号是局部符号,...I:该符号对另一个符号的间接引用 N:debug符号 R:该符号位于只读数据区 T:该符号位于代码段 U:该符号在当前文件未定义,定义别的文件 ?

    1.2K30

    Linux下,使用nm命令输出可执行文件的符号

    该任选项仅对于动态目标(例如特定类型的共享)有意义 -f, --format=FORMAT FORMAT 可取值 bsd、sysv 或 posix,该选项 GNU nm 中有用,默认为 bsd -...对于不记录符号大小的目标文件格式,此选项不起作用,除非使用了--size sort,在这种情况下,将显示计算的大小 -s, --print-armap 当列出库成员的符号,同时列出索引。...只有启用插件支持的情况下构建了工具链,此选项才可用 --size-sort 按符号大小排列 --special-syms 显示目标相关的具体特殊含义的符号。...这些符号通常被特定目标文件用于某些特殊处理,当包含在正常符号列表通常不起作用。...合成符号链接器为各种目的创建的特殊符号,默认情况下不会显示它们,因为它们不是二进制文件源代码的一部分 --target=BFDNAME 指定系统默认格式以外的目标文件格式 以上就是nm命令的简单用法

    2.5K30

    声明和定义的区别(深入理解)

    U AAA::BBB(int) 运行期间出错: U 该符号未定义过,需要自其他对象文件链接进来 上面代码a.cpp书写,编译生成文件a.obj,没有问题。...按照之前的说明,连接将错误,因为找不到符号_ABC。...因为名字_ABC对应的地址栏还空着 原因:对象(函数 类)没有定义 一般原因 1 该符号 没有在当前cpp文件实现 2 没有引入其他cpp文件() 回答:声明和定义区别 声明:定义一个符号...1.nm -D libxxx.so 打印出符号信息。...说明 1 ldd动态是不显示静态的名称的 2 静态的代码在编译过程已经被载入可执行程序 1 nm工具可以打印出库的涉及到的所有符号,这里的既可以是静态的也可以是动态的。

    1.4K100

    c和fortran混编

    比如用nm查看main.o和foo.o [zhxia@ess ~]$ nm main.o U FOO 00000000 T main U表示main.o符号foo是未定义的,需要从外部链接进来...有人说foo.o里还有一个未定义符号printf,这个到哪里去 找?gcc总是会有很多默认链接链接选项,这其中包括c的标准,而printf就在c标准。...@ess ~]$ nm foo.o 00000000 T FOO U printf 可以看出,main.o里需要用到符号名为foo_foo.o里提供的是FOO——不匹配。...就像c++要用c,也需要在声明这个的函数使用extern “C”,使c++编译器在编译这个函数生成的符号名是C风格而不是C++风格。...但是因为main.o还有一个未定义符号s_stop,而gcc默认只链接和c相关的,所以这时使用gcc -osample main.o foo.o会报错,大概就是说s_stop未定义(unreferenced

    1.6K41

    目标文件函数隐藏初探

    目标文件函数隐藏初探 场景如下,需要以.o形式(静态形式),发布一个,给其他代码集成。生成mylib.o之后,使用nm查看,可以查看到很多函数符号。...这么修改之后,本身的其他源文件,也无法使用该函数了,因为c语言中的static是将函数的作用域限定在了函数所在的源文件。...objcopy修改符号表 生成之后,可使用工具链的 objcopy 工具,修改符号表,将内部函数都修改为本地函数,这样外部代码无法直接链接到这些函数,只能使用指定的函数。...生成之后,可使用工具链的 strip 工具,裁剪符号表,将不打算给外界使用的函数,直接从符号删除。...此时,外部函数尝试链接使用,会报错 gcc main.c mylib.o -o main /tmp/cccUN3aL.o:函数‘main’: main.c:(.text+0x1e):对‘inner_fun1

    1.2K10

    错误使用 C++ 模板特化产生的坑

    这看起来完全不讲道理啊,凭什么同样一个链接 .a 和链接 .o 的结果不一样?这就要说到,编译器链接 .a 和 .o 的行为差别了。...当编译器链接 .o 的时候,它会将 .o 符号全部链接进最终文件,而当链接 .a 的时候,编译器则是会看当前链接结果是否存在未定义符号,如果没有,那就不链接这个 .a 文件里面的内容。...而如果有需要链接符号,则尝试 .a 文件查找,如果找到了,就链接这个 .a 里面的内容,否则就跳过。...另外,这顺便也能解释另一件事情:如果 main 依赖于 liba.a,而 liba.a 依赖于 libb.a,那么我们链接的时候就需要先链接 liba.a 再链接 libb.a,否则就会出现符号未定义的问题...此时 liba.a 依赖于 libb.a 的符号就是未定义的了。

    37030

    linux动态和静态

    ;nm查看包含那些函数、ar生成静态,查看包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与相关的参数-L,-l,-fPIC,-shared;静态链接搜索过程;动态链接...: 有时候可能需要查看一个到底有哪些函数,nm工具可以打印出库的涉及到的所有符号,这里的既可以是静态的也可以是动态的。...nm列出的符号有很多, 常见的有三种:: T类:是在库定义的函数,用T表示,这是最常见的; U类:是在库中被调用,并没有在库定义(表明需要其他支持),用U表示; W类:是所谓的“弱态”符号...Linux下,动态和静态同事存在,gcc/g++的链接程序,默认链接的动态。...在这个过程链接器将维持三个集合: 集合E:可重定位目标文件(*.o文件)的集合。 集合U:未解析(未定义)的符号集,即符号UNDEF的符号

    12.4K20

    CMake和静态顺序

    前言 C/C++程序的许多同学被静态的依赖折腾,因为默认情况下要求被依赖的放在依赖它的后面,当一个程序或共享依赖的静态较多时,可能会陷入解决链接问题的坑。...,这个使用静态需要注意,否则会报符号找不到问题。...gcc -c a.c ar cr liba.a a.o gcc -c b.c ar cr libb.a b.o 虽然libb.a使用到了liba.o的一些函数,并不会将它们的定义包含进来,所以链接...,-soname=libqhttpd.so -rpath 增加共享搜索路径 --retain-symbols-file表示不丢弃未定义符号和需要重定位的符号 --export-dynamic 创建一个动态连接的可执行程序时...(函数是一种符号),链接器不会将它们链接共享和可执行程序。

    6.7K50

    iOS编译原理

    ; 使用xcrun命令,查看下main.o符号: xcrun nm -nm main.o 终端显示效果如下: (undefined) external _NSLog...; 链接链接多文件时会创建符号表,用于记录所有已经定义和未定义符号; 出现相同符号,会报错:"ld:dumplicate symbols"; 在其他目标文件里没有找到到符号,会报错:"Undefined...symbols"; 另外,链接整理函数的符号调用关系,可以帮助我们理清那些函数没有被调用,并自动去除掉; 2.重定位 将变量名、函数名这些符号定义与一个内存位置关联起来; 因为只有通过了绑定,机器才知道需要操作什么内存地址...但是这些符号都会被记录下来,在运行时再通过dlopen和dlsym动态链接绑定; 动态链接:作用于运行时,这样的优势在于:诸多类似UIKit这样的共享将不必包含在每一个App包里。...比如:我们使用到的UIKit系统,等到点击App真正开始运行之前,才会去链接依赖的UIKit,链接完成再运行App;

    1.6K20

    Xcode 常见 CLI 工具

    nm 作用:nm 命令是 linux 下自带的特定文件分析工具,一般用来检查分析二进制文件、文件、可执行文件符号表,返回二进制文件各段的信息,查看二进制目标文件的符号,主要就是函数名称以及全局变量...的程序符号nm XXX # 查看所有符号,会打印出符号来源哪个地方 nm -nm XXX # 找到未定义符号,也就是外部符号 nm -u XXX 前面我们曾经查看过xcodebuild的符号...,其中全部的类型包括: A 该符号的值今后的链接中将不再改变; B 该符号放在 BSS 段,通常是那些未初始化的全局变量; D 该符号放在普通的数据段,通常是那些已经初始化的全局变量; T 该符号放在代码段...,通常是那些全局非静态函数; U 该符号未定义过,需要自其他对象文件链接进来; W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。...-m 变更成员文件备存文件的次序。 -p 显示备存文件的成员文件内容。 -q 将问家附加在备存文件末端。 -r 将文件插入备存文件。 -t 显示备存文件中所包含的文件。

    3.4K21

    静态链接和动态链接的区别

    3.2、隐式方式使用动态程序隐式使用动态和使用静态完全一样,也是使用到这些公用函数的源程序包含这些公用函数的原型声明,然后在用gcc命令生成目标文件指明动态名进行编译。...lib,/usr/libflag表示什么时候解决未定义符号(调用)。...取值有两个:1) RTLD_LAZY : 表明动态链接的函数代码执行时解决。2) RTLD_NOW : 表明dlopen返回前就解决所有未定义符号,一旦未解决,dlopen将返回错误。...6、查看符号1、使用nm命令可以打印出库涉及到的所有符号。...既可以是静态也可以是动态的常见的三种符号:①在库中被调用,没有在库定义(表明需要其他支持),用U表示②在库定义的函数,用T表示③“弱态”符号,他们虽然在库中被定义但是可能被其他同名的符号覆盖

    8.3K21

    Linux命令(65)——ld命令

    -b :指定目标代码输入文件的格式 -Bstatic:只使用静态 -Bdynamic:只使用动态 -Bsymbolic:把引用捆绑到共享的全局符号 -c <MRI-commandfile...脚本命令“FORCE_COMMON_ALLOCATION”具有相同的效果 -defsym:输出文件创建指定的全局符号 -demangle:错误消息还原符号名称 -e :使用指定的符号作为程序的初始执行点...-E,--export-dynamic:对于ELF格式文件,创建动态链接的可执行文件,把所有符号添加到动态符号表 -f ,--auxiliary=:对于ELF格式共享对象,设置...org>:使用指定的地址作为bss段的起始点 -t,--trace:处理输入文件显示它们的名称 -u ,--undefined=:强制指定符号输出文件作为未定义符号...warn-once:对于每个未定义符号只发出一次警告 -warn-section-align:如果为了对齐而改动了输出段地址,则发出警告 --whole-archive:对于指定的存档文件,存档包含所有文件

    17.5K13

    linux后台开发常用调试工具

    一、编译阶段 nm 获取二进制文件包含的符号信息 strings 获取二进制文件包含的字符串常量 strip 去除二进制文件包含的符号...默认状态下调试符号不会被列出) -l 列出符号源代码对应的行号(指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。...对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空) -n 根据符号的地址来排序(默认是按符号名称的字母顺序排序的) -u 只列出未定义符号...strip(去除二进制文件里面包含的符号) 用途: 可执行程序减肥(通常只已经调试和测试过的生成模块上,因为不能调试了) 反编译、反跟踪 readelf(显示目标文件详细信息) nm...参数: -a 显示函数名或文件行号前显示地址 -b 指定二进制文件格式 -C 解析C++符号为用户级的名称,可指定解析样式 -e 指定二进制文件

    3.8K151

    头文件是必须的吗?跟一跟编译过程~~~

    上面的ld是链接器,是一个可执行程序,它的输入是一个或多个目标文件,如上面指令的main.o。 也就是说,目标文件main.o引用了func(),链接器找不到它的定义。...显然,main.o引用但未定义的func()被链接func.o中找到了。...即,链接面对一个目标文件,如果碰到里面有未定义的引用,会在其他目标文件查找,如果找不到,则报错“undefined reference to”。如果找到有且仅有一个,则pass。...而且,链接输入目标文件的顺序与first defined here相关。 我们还是main.cpp只保留func()函数的声明,再单独编译汇编生成main.o。...接下来用nm看下main.o符号的内容: PS F:\Jungle\1.Program\4.C++\4.Compiler> g++ -S .

    2.1K10

    找到go程序的真正入口

    大写则表明该符号是global(external)的 A:该符号的值是绝对的,以后的链接过程,不允许改变。...C:该符号为common。common symbol是未初始化数据段。该符号没有包含于一个普通section。只有链接过程才进行分配。符号的值表示要分配的字节数。...例如,一个c文件,定义 int g_no_init,并且该符号别的地方会被引用,则该符号类型就是C,否则为B。 D:该符号位于初始化数据段。一般来说,分配到data section。...U:符号在当前文件未定义的,即该符号的定义别的文件。...比如,当前文件调用另一个文件的函数,在这个本目标文件,函数就是未定义的。但是定义它的文件,类型为T。但是对于全局变量来说,定义它的文件符号类型是C,使用它的文件,类型是U。

    10610

    Linux后台服务常用诊断命令和方法

    net.core.somaxconn = 262144 选项的默认值是128, 这个参数用于调节系统同时发起的tcp连接数,高并发的请求,默认的值可能会导致链接超时或者重传,因此,需要结合并发请求数来调节此值...默认状态下调试符号不会被列出) -l 列出符号源代码对应的行号(指定这个参数后, nm将利用调试信息找出文件名以及符号的行号。...对于一个已定义符号,将会找出这个符号定义的行号, 对于未定义符号,显示为空) -n 根据符号的地址来排序(默认是按符号名称的字母顺序排序的) -u 只列出未定义符号 常用nm -CAln xxx 等价于...可以根据符号还原对应的函数调用名,命令空间,类名 2.1.5 反编译,反跟踪 nm 程序可用于列举符号及其类型和值, 但是,要更仔细地研究目标文件这些命名段的内容, 需要使用功能更强大的工具。...2.2.2 ldd 显示程序需要使用的动态和实际使用的动态 ldd -r .

    1.6K82

    一些“简单”的linux命令(r2笔记46天)

    有些linux命令看起来极其简单,只包含2个字符,确有很强的功能性。看起来还是有些陌生的命令,不过在工作别忘记它们的存在。...查找共享的函数 比如我查看oracle的一些文件的函数,可以这样 cd $ORACLE_HOME/rdbms R ----Read only symbol 。...子程序都是这种符号,比如文件实现了一个函数function,则function就是这种符号; U ----未定义符号。...如果文件引用了不存在的函数,则这些未定义的函数就是这种类型; S ----未初始化的符号。比如全局变量int s ; 则s就是这种类型的符号。...ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

    71080
    领券