gcc 编译时对’xxxx’未定义的引用问题

2024-09-03 05:48

本文主要是介绍gcc 编译时对’xxxx’未定义的引用问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 或者动态库.so文件时没有问题,但是编译链接为可执行文件的时候会出现找不到’xxx’的定义的情况。

例如:

sl:02$ gcc -fPIC -shared -I. hard_disk_factory.c seagate_hard_disk.c toshiba_hard_disk.c -o libhard_disk.so
sl:02$ gcc -I. -L ./ -lhard_disk main.c -o test
/tmp/ccODhv1I.o:在函数‘main’中:
main.c:(.text+0x27):对‘HardDiskFactory’未定义的引用
main.c:(.text+0xa7):对‘_HardDiskFactory’未定义的引用
collect2: error: ld returned 1 exit status

原因

出现这种情况的原因,主要是C/C++编译为obj文件的时候并不需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法通常就是相关的头文件未包含,包含即可

解决办法

gcc 依赖顺序问题

这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。

gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。

在gcc编译时,链接库的指定顺序会影响编译行为

gcc手册说明:

-l librarySearch the library named library when linking.  (The second alternative with the library as a separate argument is only for POSIX compliance and is notrecommended.)It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they arespecified.  Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o.  If bar.o refers to functions in z, those functions may not beloaded.The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a.  The linker then uses this file as ifit had been specified precisely by name.The directories searched include several standard system directories plus any that you specify with -L.Normally the files found this way are library files---archive files whose members are object files.  The linker handles an archive file by scanningthrough it for members which define symbols that have so far been referenced but not defined.  But if the file that is found is an ordinary object file,it is linked in the usual fashion.  The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and.a and searches several directories.

即链接时,符号寻找过程是根据库路径列表依次找到需要链接的库,若一个库在该路径列表中存在多个,则使用第一个找到的。从左向右,依次找寻符号定义gcc -o c -lb -la,符号搜寻过程是c=>b, b=>a
所以在main.c中使用了libhard_disk.so库中相关的函数,那么编译的时候必须是main.c在前,-lhard_disk在后。

上面出现问题的原因就是依赖库的顺序在前面,将其放置在后面即可。

sl:02$ gcc main.c -I. -L ./ -lhard_disk -o test

这篇关于gcc 编译时对’xxxx’未定义的引用问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132194

相关文章

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR