当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《链接器问题-未定义的引用》经验,为你挑选了2个好方法。

我的编译器有一个问题,告诉我有一个'未定义的引用'我要在库中使用的函数.让我分享一下这个问题的一些信息:

我正在用gcc交叉编译C语言.

我正在调用一个库函数,该函数可以通过包含头文件来访问,该头文件包含另一个包含原型的头文件.

我已经使用-I包含了头文件目录,我确信它已被找到.

我首先创建.o文件,然后在单独的命令中链接它们.

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

一些建议会很好,也许可以解释链接器如何做它的事情.

谢谢!


回答答案

没有.a库文件,库中只有.h和.c,所以-l不合适

我对库文件的理解是它只是头文件和源文件的集合,但也许它是从源创建的.o文件的集合?!

没有创建库对象文件,也许应该有?是的,似乎我不明白包含和库之间的区别...我将继续努力:-)

感谢所有的回复!我学到很多关于图书馆的知识.我想把所有答案都作为公认的答案:-)



1> Diomidis Spi..:

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

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

以下是一些其他详细信息,可帮助您调试问题。按照惯例,库文件的名称以lib为前缀,并且(以其静态形式)具有.a扩展名。因此,系统默认数学库的静态链接版本(您使用-lm链接的版本)通常位于/usr/lib/libm.a中。要查看给定库定义的符号,可以在库文件上运行nm --defined-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



2> Peter K...:

听起来你没有编译库中的.c文件来生成.o文件.链接器将在通过编译库生成的.o文件中查找原型的实现

您的构建过程是否编译库.c文件?

如果它实际上只是源代码,为什么称它为"库"?

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有