即使链接具有定义的库后,也会出现“未定义的函数引用”问题

2024-02-21

我正在尝试使用 .o 、.so、.a 文件创建可执行文件。

这是我的构建命令:-

pkgs/gcc/v4.8.3/bin/gcc -L/usr/X11R6/lib -O2 -DUSE_FLEX -Wall -Wno-char-subscripts -fPIC -DLINUX -DG_DISABLE_CONST_RETURNS -fno-strict-aliasing -o ../build/kl/Release/test/bin/pure.exe -L../build/kl/Release/test/modules ../build/kl/Release/test/maker/constrfunc.TCL.o ../../build/kl/Release/test/maker/pvdbprocs.TCL.o .. ../build/kl/Release/test/maker/maker/memmaker.TCL.o .. ../build/kl/Release/test/maker/modules/libdenbase.a .. ../build/kl/Release/test/maker/guibase.o -litk3.2 -litcl4.0.0 -ltk8.3 -lcdnviptcl8.4 -litclstub4.0.0 -ldenbase -lglib-2.0 -ldenbase -lX11 -ldl -lm -lviputil -lvippli -lcdsCommonMT_sh -lpthread  -L/home/dlb/extlibs/arm/lib 

我的库在路径 "-L/home/dlb/extlibs/arm/lib" 处具有函数的定义。仍然在下面抛出错误。

Error:

../build/kl/Release/test/maker/guibase.o: In function `decodeAddrList':
tree234.c:(.text+0xc): undefined reference to `ptritclStubsPtr'
tree234.c:(.text+0x20): undefined reference to `ptrlitclStubsPtr'
tree234.c:(.text+0x12c): undefined reference to `ptrlitclStubsPtr'
tree234.c:(.text+0x140): undefined reference to `ptrlitclStubsPtr'

我在库中有符号,位于路径 /home/dlb/extlibs/arm/lib :-

命令:-

readelf -s libitcl4.0.0.so | grep ptrlitclStubsPtr

348: 0000000000060f10     8 OBJECT  LOCAL  DEFAULT   24 ptrlitclStubsPtr

我在这里错过了什么吗?

请注意,OP 在同一问题的转发中提供了更多信息;
引用OP评论:
“由于一些隐私问题...我正在重命名符号..它是由我编辑的...这是拼写错误...我刚刚更正了它...:)”
IE。错误消息和 grep 行中的标识符以及 grep 行的输出已被手动更改。


看起来你要问的功能是local到定义它们的文件。也就是说,看起来它们明确不打算(甚至不允许)从外部调用。

也就是说,共享库源代码中的某个位置libitcl4.0.0.so可能会出现这样的声明:

static tclStubs *ptrlitclStubsPtr;

那个关键词static表明能见度结果符号的ptrlitclStubsPtr仅限于其自己的源文件。

我从你报道的事实中推断出这一切readelf输出包括行

348: 0000000000060f10     8 OBJECT  LOCAL  DEFAULT   24 ptrlitclStubsPtr

那面旗帜LOCAL表明该符号是本地的。如果它是全局的,打算(并且能够)从外部调用,则该标志GLOBAL将会出现。

为什么变量被设为私有(static)像这样,所以你不能使用它们?这是一个软件工程的东西,“信息隐藏”,旨在减少你和图书馆之间的界面“宽度”libitcl4。私有符号与内部的实现决策更加紧密地联系在一起libitcl4,决定是not应该对呼叫者可见或有任何关注。人们认为,如果调用者能够访问这些符号,调用者还必须知道其他实现细节,这意味着作者libitcl4然后将无法在不破坏(无效)调用代码的情况下更改这些实现细节。因此,为了防止出现这种情况,通常会做出选择,使调用者不可能以这种方式变得依赖。

在这种情况下,你基本上有三种前进路径:

  1. 去除static源中变量声明的标签libitcl4.0.0.so。 (这显然要求您有权访问源libitcl4.0.0.so,以及重建它的能力。这也可能是一个非常糟糕的主意。正如我所解释的,这些符号被设为静态可能是有充分理由的。)

  2. 添加一个新函数libitcl4.0.0.so它会执行您需要完成的任何操作,并且由于它位于同一源文件中,因此它确实可以访问这些符号。 (这也要求您有权访问并能够重建“libitcl4.0.0.so”。)

  3. 利用现有的公共设施,寻找其他方式来做您需要做的事情libitcl4.0.0.so.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使链接具有定义的库后,也会出现“未定义的函数引用”问题 的相关文章

随机推荐

  • Flash 设计师/编码员协作最佳实践

    我已经完成了几个 Flash 项目 作为 ActionScripter 由设计师负责所有漂亮的事情和动画 刚开始时 我发现了很多有关 ActionScript 编码和 Flash 设计的信息 大多数可用信息似乎都集中在其中之一 我没有找到任
  • cURL 慢启动传输时间

    再会 请求页面时 cURL 的运行速度非常慢 我知道这不是所请求的页面 因为该页面立即返回到浏览器中 我注意到的两件事 starttransfer time 通常接近 20 local port 似乎每次都会改变 这正常吗 有时 cURL
  • 如何在 Freemarker 模板中访问 Spring 应用程序属性?

    我有使用 Spring 3 1 的 Java web 应用程序 以及用于渲染视图的 Freemarker 模板 我想根据特定应用程序属性的真 假值有条件地在视图中显示链接 我在中定义了以下应用程序属性src main resources a
  • 如何获取列表视图位置?

    我在 Listview onListItemClick 方法中遇到问题 我没有得到列表的位置 这是我的代码请帮助我 求职信选择 xml
  • Angular:用逗号格式化数字

    标题非常概括了我的需求 123456789 gt 123 456 789 12345 gt 12 345 获得这种转化的最佳方法是什么 不要建议在 Angular 2 中使用货币管道 因为我不需要在输出前添加 或货币符号 像这样使用 Dec
  • 将某些日期替换为 NA

    我正在尝试用 NA 替换某些日期 我尝试了以下方法 但没有成功 df lt data frame dates seq Date as Date 1910 01 01 as Date 1999 01 01 days gt mutate if
  • Maven Release-plugin“标签已存在”对于不存在的标签

    我的设置 git 存储库在Atlassian Stash 服务器和Atlassian Bamboo 我在用着Maven 3 1 1与release plugin 2 3 2 该计划在Bamboo看起来像这样 退房自git 存储库 执行一个c
  • 在Android中设置Crouton消息的持续时间

    我已经开始使用 Crouton 消息而不是 toast 消息 因为我可以配置持续时间 有什么方法可以继续显示油煎面包块消息 直到发生特定事件 而不是以明确的单位指定时间 您可以将油煎面包块的持续时间设置为INFINITE从内部Configu
  • 如何从 C# Web 服务生成 WSDL 文件

    我创建了一个像这样的WebService WebService Namespace http ns WebServiceBinding ConformsTo WsiProfiles BasicProfile1 1 public class
  • 当应用程序处于后台时,活动在“最近”中不可见

    问题描述 在我的一个应用程序中 我看到了相当奇怪的行为 当我的应用程序在前台运行 最顶层的应用程序 时 我可以在系统的 最近 中看到其活动 但一旦我将其置于后台 相同的活动 即AccountsActivity 刚才列出的内容不再出现在 最近
  • 解组非根元素时的 JAXB 模式验证

    当您使用 JAXB 解组整个 XML 时 您可以设置 XML 模式以在解析期间启用验证 javax xml validation Schema schema jaxbUnmarshaller JAXBContext newInstance
  • 逐行读取并存储在结构体数组中

    我正在尝试从文本文件中逐行读取行并将其存储在数组中 txt 文件中有一些问题将询问玩家 下面是一些问题 1 N r kom potatisen till Europa A 1300 talet B 1500 talet C 900 tale
  • 禁用 Maven 内部版本号插件

    目前我们正在开发一个大型 Maven 项目 该项目有大约 100 个模块 其中一些还有子模块 一些模块使用 Maven Build Number 插件 该项目是在 Subversion 下托管的 最近我们的开发团队开始在本地使用 git 克
  • 使用 firebase 作业调度程序安排重复作业

    我试图每 10 分钟将 Android 设备的位置发布到服务器一次 我正在使用 firebase 作业调度程序来执行此操作 FirebaseJobDispatcher dispatcher new FirebaseJobDispatcher
  • 仅针对单个模式生成流畅的代码

    有没有办法让 Slick 的代码生成仅为单个模式生成代码 你说 公开 我有一些扩展可以创建大量的表 例如 postgis pg jobman 从而使 slick 生成的代码变得巨大 将此代码与适当的值和模式名称一起使用 object Cod
  • 如何在eclipse中缩进jsp页面

    刚开始使用 jsp 我的页面看起来很糟糕 请建议一种缩进的方法 thanks 首先确保您安装了 Web Tools 如果没有 请检查此链接 http download eclipse org webtools updates http do
  • 提升 Asio 单线程性能

    我正在实现需要维护大量 100K 或更多 长期连接的自定义服务器 服务器只是在套接字之间传递消息 并且不进行任何认真的数据处理 消息很小 但每秒都会接收 发送许多消息 减少延迟是目标之一 我意识到使用多核不会提高性能 因此我决定通过调用在单
  • Python 中的自定义错误消息

    所以我正在练习一些单元测试 我有一个关于错误消息的问题 我正在尝试创建一条自定义错误消息 该消息将在测试失败时显示 这是一个基本的 Hello World 程序 测试运行良好 一切正常 但这是我收到的错误消息 F FAIL test Str
  • ADO.NET 数据表约束如何影响性能?

    DataTable 上的约束 例如主键和唯一约束 是否可以像在 SQL Server 中一样使 Select 更高效 或者他们的唯一目的是对数据执行规则 myDT Constraints Add PK myDT Columns Unique
  • 即使链接具有定义的库后,也会出现“未定义的函数引用”问题

    我正在尝试使用 o so a 文件创建可执行文件 这是我的构建命令 pkgs gcc v4 8 3 bin gcc L usr X11R6 lib O2 DUSE FLEX Wall Wno char subscripts fPIC DLI