libgdal.so.20:对‘sqlite3_column_origin_name’未定义的引用

我有个mtcnn-ncnn工程,以前编译都正常,后面加入了数据库sqlite管理,再去掉了sqlite配置,然后编译就报错了
//usr/lib/libgdal.so.20:对‘sqlite3_column_origin_name’未定义的引用
//usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
collect2: error: ld returned 1 exit status

百度和谷歌了很久,方法都没用,也卸载重新安装过sqlite3,libgdal,opencv等,都不行。
最后原因是我安装sqlite3是下载的源码编译安装了,安装脚本有自动修改系统配置
sqlite-autoconf-3300100.tar.gz

所以我进到源码目录

sqlite-autoconf-3300100$ sudo make uninstall
 ( cd '/usr/local/bin' && rm -f sqlite3 )
 ( cd '/usr/local/include' && rm -f sqlite3.h sqlite3ext.h )
 /bin/bash ./libtool   --mode=uninstall rm -f '/usr/local/lib/libsqlite3.la'
libtool: uninstall: rm -f /usr/local/lib/libsqlite3.la /usr/local/lib/libsqlite3.so.0.8.6 /usr/local/lib/libsqlite3.so.0 /usr/local/lib/libsqlite3.so /usr/local/lib/libsqlite3.a
 ( cd '/usr/local/share/man/man1' && rm -f sqlite3.1 )
 ( cd '/usr/local/lib/pkgconfig' && rm -f sqlite3.pc )

卸载完再去mtcnn源码执行make,就能正常编译过了。神坑。

<think>嗯,用户的问题是关于检查libgdal.so中符号__floatditf的引用情况,使用nm命令后显示U __floatditf,这是什么原因,应该怎么解决呢。首先,我需要回忆一下nm命令的输出含义。U符号通常表示未定义的符号,也就是说在libgdal.so中这个符号被引用,但并没有在它的内部定义。这可能会导致动态链接时找不到该符号,从而出现运行时错误。 接下来,我需要分析为什么会出现这种情况。可能的原因有几个:首先,__floatditf可能是由编译器生成的,用于处理某些长整型到浮点型的转换,尤其是在不同的架构或ABI中。其次,libgdal.so可能在编译时依赖了某个库,但这个库没有被正确链接或者版本不兼容。例如,用户之前提到的libtiff或sqlite的问题,可能类似,但这次是另一个符号的问题。 解决方案方面,可能需要检查编译libgdal时的依赖库是否正确安装,特别是与编译器运行时库相关的部分,比如libgcc或者libgcc_s.so。有时候,静态链接和动态链接的混合使用也可能导致符号未定义的问题。用户可能需要重新编译libgdal,并确保在编译时链接了正确的库,或者设置相关的编译选项,比如CFLAGS或LDFLAGS来包含必要的库路径。 另外,检查系统中是否存在多个版本的某些库,比如libgcc,这可能导致链接时选择了错误的版本。使用LD_PRELOAD或者更新LD_LIBRARY_PATH可能临时解决,但长期可能需要正确安装依赖。此外,可能需要查看libgdal的编译日志,确认是否有关于__floatditf的警告或错误,从而调整编译参数。 最后,可能需要确认系统架构和库的兼容性,比如32位和64位库是否混用,或者是否缺少某些开发包。例如,安装libgcc-dev或类似包可能提供缺失的符号定义。如果用户是在特定的环境下编译,比如交叉编译,可能需要检查交叉编译工具链的配置。</think>### 分析`__floatditf`符号未定义问题 #### 1. 现象描述 执行命令`nm libgdal.so | grep __floatditf`时,输出显示`U __floatditf`,其中`U`表示该符号在`libgdal.so`中被引用未定义,需依赖外部动态库提供[^1]。 #### 2. 符号作用与背景 - `__floatditf`是编译器生成的内部函数,用于将64位有符号整数(`long long`)转换为128位浮点数(`long double`),常见于跨架构或ABI兼容场景[^2]。 - 该符号通常由`libgcc`或`libgcc_s.so`提供,若链接时未正确关联这些库,会导致运行时未定义错误。 #### 3. 原因分析 - **依赖库缺失或版本冲突**:系统中缺少`libgcc`的动态库或静态库,或版本不兼容。 - **编译参数问题**:编译`libgdal`时未正确链接`libgcc`,或使用了不兼容的编译器选项(如混合静态/动态链接)。 - **多版本库冲突**:系统中存在多个`libgcc`版本,导致链接器选择了错误的版本[^5]。 #### 4. 解决方案 ##### 方法1:安装或修复编译器运行时库 ```bash # 安装 libgcc(Ubuntu/Debian) sudo apt-get install libgcc-{version}-dev # 查找符号定义(确认库路径) find /usr/lib -name "libgcc*" | xargs nm -D | grep __floatditf ``` ##### 方法2:重新编译libgdal并显式链接libgcc 在编译命令中添加`-lgcc`: ```bash CFLAGS="-lgcc" LDFLAGS="-lgcc" ./configure make sudo make install ``` ##### 方法3:运行时指定库路径(临时解决) ```bash # 通过 LD_PRELOAD 强制加载正确版本(示例路径) export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libgcc_s.so.1 ``` #### 5. 验证步骤 ```bash # 检查符号是否被正确解析 ldd libgdal.so | grep libgcc nm -D libgdal.so | grep __floatditf # 若显示为 T(已定义)则解决 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值