链接器问题 - 未定义的引用

2024-05-21

我的编译器有问题,告诉我有一个“未定义的引用”我想在库中使用的函数。让我分享一些有关该问题的信息:

  • 我正在用 gcc 交叉编译 C 语言。
  • 我正在调用一个库函数,该函数通过包含的标头访问,其中包含另一个标头,其中包含原型。
  • 我已经使用 -I 包含了 headers 目录,并且我确信它已被找到。
  • 我首先创建 .o 文件,然后在单独的命令中链接它们。

所以我的想法是,这可能是我包含库文件的顺序,但我不确定排序它们的正确方法是什么。我尝试在 .o 文件之前和之后都包含 headers 文件夹。

有些建议会很棒,也许还可以解释链接器如何完成其​​工作。

Thanks!


对答案的回应

  • 库中没有 .a 库文件,只有 .h 和 .c,因此 -l 不合适
  • 我对库文件的理解是,它只是头文件和源文件的集合,但也许它是从源创建的 .o 文件的集合?!
  • 没有创建库对象文件,也许应该有?是的,似乎我不明白包含和库之间的区别...我会努力解决这个问题:-)

感谢您的所有回复!我学到了很多关于图书馆的知识。我想将所有回复作为已接受的答案:-)


标头提供函数声明和函数定义。为了允许链接器找到函数的实现(并摆脱未定义的引用),您需要要求编译器驱动程序(gcc)使用 -l 标志链接函数所在的特定库。例如,-lm 将链接数学库。函数的手册页通常指定必须指定哪个库(如果有)才能查找该函数。

如果链接器找不到指定的库,您可以使用 -L 开关添加库搜索路径(例如 -L/usr/local/lib)。您还可以通过 LIBRARY_PATH 环境变量永久影响库路径。

以下是一些可帮助您调试问题的其他详细信息。按照惯例,库文件的名称以 lib 为前缀,并且(以静态形式)具有 .a 扩展名。因此,系统默认数学库的静态链接版本(使用 -lm 链接的那个)通常驻留在 /usr/lib/libm.a 中。要查看给定库定义了哪些符号,可以在库文件上运行 nm --define-only 。在我的系统上,在 libm.a 上运行命令会得到如下所示的输出。

e_atan2.o:
00000000 T atan2

e_asinf.o:
00000000 T asinf

e_asin.o:
00000000 T asin

要查看编​​译器使用的库路径以及默认加载的库,您可以使用 -v 选项调用 gcc。在我的系统上,这再次给出以下输出。

GNU assembler version 2.15 [FreeBSD] 2004-05-23 (i386-obrien-freebsd) 
using BFD version 2.15 [FreeBSD] 2004-05-23
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o 
/usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib /var/tmp//ccIxJczl.o -lgcc -lc 
-lgcc /usr/lib/crtend.o /usr/lib/crtn.o
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接器问题 - 未定义的引用 的相关文章

随机推荐

  • “#define for if (false) {} else for”的可能用途是什么?

    在另一个问题中 我刚刚发现了这个小珍珠C wisdom define for if false else for 这导致 MSVC 对于一个相当有效的语句发出 常量表达式 警告 for int i 0 i lt 10 i 我明白whyMSV
  • 替换C#字符串中的数字

    我正在尝试使用正则表达式对字符串进行一些工作 但遇到了一些困难 我的目标是用字符替换字符串中的数字 特别是如果字符串中有一组数字 我想用一个字符替换整个数字组 如果只有一个数字 我想将其替换为 例如 如果我有字符串 test12345 tx
  • 使用php插入sql数据库时出错

    我有一个带有 MySQL 插入查询的程序 sql INSERT INTO people person id name username password email salt VALUES person id name username p
  • 根据类别 woocommerce 更改同一产品的默认变体值

    我正在研究一种根据其所属类别显示同一产品的默认变体值的方法 例如 我出售一张带有蓝色和红色选项的卡 当用户进入 一 类别时 我希望默认值为蓝色 如果他属于第二类 则该值将为红色 我发现了一个钩子woocommerce product def
  • 如何将接口转换为接口切片?

    我的输入是interface 而且我知道它可以是任何类型的数组 我想读取我输入的元素之一 所以我尝试将我的interface 进入一个 interface 但是 go 会给我以下错误 恐慌 接口转换 interface 是 map stri
  • 将视图文件作为资源嵌入二进制文件中

    我正在尝试创建一个带有少量控制器的 Net 库 并且我想在多个 Web 项目中重用它们 我已经完成一半了 但我遇到的问题是 每当我将库添加到新的 Web 项目时 我需要将所有相应的视图文件单独复制到新项目中 每当我更新库时 我都需要再次重复
  • 使用来自另一个的 SELECT 更新表,但字段为 SUM(someField)

    基本上我有这样的事情 UPDATE Table SET Table col1 other table col1 FROM Table INNER JOIN other table ON Table id other table id 问题是
  • iphone opencv - 模板匹配

    我已经在我的 iphone 项目中实现了这个 OpenCV 构建 http aptogo co uk 2011 09 opencv framework for ios http aptogo co uk 2011 09 opencv fra
  • PHP别名@函数

    我是 PHP 新手 看到一些使用 前缀调用函数 如 mysql ping 的示例 我感到很困惑 它是做什么用的 谷歌搜索 搜索没有太大帮助 因为 被丢弃并且 别名 不是足够好的关键字 抑制错误 警告和通知 如果你用自定义的方式补充它 你可以
  • Android 中的 java.util.Observable 是线程安全的吗?

    Android 中的 java util Observable 是线程安全的吗 这文档 http developer android com reference java util Observable html说只有deleteObser
  • PHP 和 MySQL 的重音字符错误

    我的问题是 直接通过 PHP 编写的内容是正确重音的 但是当重音单词来自 MySQL 时 字母会像这样 我尝试使用html charset as ISO 8859 1它修复了 MySQL 字母 但破坏了其他字母 解决这一切的一种方法是设置我
  • 如何使用 python 有效地找到两个大文件的交集?

    我有两个大文件 它们的内容如下所示 134430513125296589151963957125296589 该文件包含未排序的 id 列表 某些 id 可能会在单个文件中出现多次 现在我想找到路口两个文件的一部分 这就是两个文件中都出现的
  • 有没有办法检测 iOS 设备进入睡眠模式(屏幕变黑时)时的事件?

    我想检测两个事件 设备被锁定 解锁 设备进入睡眠状态并且屏幕变黑 我在这里实现的第一个目标是 有没有办法检查 iOS 设备是否锁定 解锁 https stackoverflow com questions 14229955 is there
  • 如何在MVC模型中编写可重用的业务逻辑?

    我的问题是我们尝试使用 MVC PHP 框架 经过多次讨论后 我认为 MVC 非常好 但我缺少编写可重用模型 应用程序 逻辑的可能性 因此 我不确定我们是否有正确的方法在 MVC 框架中实现我们的软件 首先 我将描述我们目前使用的非 MVC
  • 斯威夫特/iOS。从导航堆栈中删除一些视图控制器

    这是我想做的 但我不确定这是否是正确的方法 所以请给我建议如何去做 我有初始 VC 和导航 VC 我从中推送第一个 VC 从中推送第二个 VC 接下来我介绍 来自第二个 VC 的 NavigationController 第三个 VC 现在
  • SBCL初始化文件

    我想知道应该在哪里保存 sbclrc 文件 我尝试将其保存在我的 sbcl 文件夹中 但它似乎不起作用 我使用的是 Windows XP 和 Emacs 版本 23 我正在尝试设置 asdf install 这就是为什么我要修改初始化文件
  • 如何分块加载 Pickle 文件?

    是否有任何选项可以批量加载 pickle 文件 我知道我们可以将数据保存在 CSV 中并分块加载 但除了 CSV 之外 是否有任何选项可以批量加载 pickle 文件或任何 python 本机文件 基于Python pickle 的文档 h
  • Android ListView 自定义适配器 ImageButton

    这可能不是正确的方法 如果有更好的方法请告诉我 我创建了一个自定义适配器类 在我的 getView 方法中我膨胀了我想要使用的视图 public View getView int position View convertView View
  • python 和 gtk3 剪贴板 onChange

    使用 PyGTK 2 我可以附加一个在剪贴板内容更改时要执行的函数 浏览 GTK3 的 python 绑定的文档 我找不到此类功能的任何描述 谁能告诉我这方面的 最佳实践 EDIT 使用 gtk2 可以实现以下功能 import gtk d
  • 链接器问题 - 未定义的引用

    我的编译器有问题 告诉我有一个 未定义的引用 我想在库中使用的函数 让我分享一些有关该问题的信息 我正在用 gcc 交叉编译 C 语言 我正在调用一个库函数 该函数通过包含的标头访问 其中包含另一个标头 其中包含原型 我已经使用 I 包含了