Could not read symbols

陈运文

Could not read symbols:Linux/UNIX系统下编译时,常见的一类报错信息。

  通常情况下,该编译报错信息之前会给出出现错误的静态库(.a结尾文件)、或动态库(.so结尾文件),
  该报错的基本原因是当前编译器无法对库文件进行正确的解析

Could not read symbols报错类型

  具体的报错信息会在Could not read symbols:字段后给出,常见的一些报警信息形如:
  /usr/lib/libdemo.so: could not read symbols: File in wrong format
  /usr/lib/libz.a: Could not read symbols: Bad value
  /usr/lib/libcode.a: Could not read symbols:Invalid operation
  /usr/lib/htmlparse.a: could not read symbols: Archive has no index; run ranlib to add one
  /usr/lib/htmlparse.a: could not read symbols: Malformed archive
  Linux出现Could not read symbols报警主要原因为当前编译环境和库文件生成时对应的环境不同,由于Linux本身编译选项非常复杂,可以从以下几个方面逐步排查:

Could not read symbols原因和解决方案

  1、 gcc/g++版本不正确
  众所周知Linux gcc编译器(GNU Compiler Collection)是功能强大的交叉编译器,但其众多的版本会导致兼容问题。如果联编所使用的 .a/.so文件是由另一个不同版本的gcc编译生成后,当移植到另一个不同版本gcc环境下编译时,(例如:将gcc2.9x老版本下的.so,拷贝入新版gcc环境使用),且编译版本不兼容,会出现Could not read symbols的报错。(可以使用gcc -v 查看一下当前版本)
  如果是这种原因导致的问题,需要在新gcc版本下,删除(或更名)旧的库文件,重新由src编译生成.a/.so文件,保证gcc版本一致

  2、64bit/32bit编译环境不一致
  目前Linux OS系统会推出32位和64位两个不同的版本,此时即使使用命令:
  gcc --version
  查看的gcc三位版本一致,但由于32位程序和64位程序可能不兼容,因此如果在32bit OS环境下编译获得的库文件,移植入64bit环境时会产生Could not read symbols错误

  一个简单的方式查看当前系统位数:
  getconf LONG_BIT
  结果显示:32 or 64

  请确定在操作系统位数相同的环境下进行编译,否则删除原库文件重新生成

  3、Makefile配置问题
  查看编译期参数是否缺少 -fPIC , 不仅是共享库,静态库有时也需要有 -fPIC参数
  或者查看Makefile是否存在前后配置项不一致

  4、修改configure配置
  操作系统位数可能导致的另一个问题是,所使用的底层库不同 
  linux系统在 /usr/lib/ 和 /usr/lib64/ 两个目录下,会分别存放不同位数版本的lib,
  可通过修改环境配置来指定所需的库位置:
  # ./configure --enable-lib64 --libdir=/usr/lib64
  解决库版本问题

  已知的一个常见问题是:在64位机器上编译httpd-2.0.x时常会出现该原因导致的Could not read symbols报错,通过该方法可解决
  另外,64位系统编译脚本在定位expat上存在问题(编译apache时常出现),修改configure使用自带的expat来编译可解决,具体修改configure配置的方法是增加:
  --with-expat=builtin

  5、Lib路径错误
  目标路径的库文件不存在或不一致,也会导致Could not read symbols错误,
  可以查看路径和库文件所在位置是否一致,环境变量 LD_LIBRARY_PATH 中指明库的搜索路径是否有误

Could not read symbols扩展
  

具体的编译环境和选项错综复杂,如果通过上述方法仍存在错误,可以将错误信息,Makefile,configure等贴至一些知名的Linux技术论坛,以寻求更具体的帮助

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cserchen/archive/2010/04/22/5515974.aspx

Could not read symbols解决方法的更多相关文章

  1. Undefined symbols for architecture armv7错误解决方法

    Undefined symbols for architecture armv7: "_OBJC_CLASS_$_BriefMainModel", referenced from: ...

  2. 关于Quartus II 13.0对应开发NIOS II软件程序时报错Symbol 'NULL' could not be resolved问题的解决方法

    关于Quartus II 13.0对应开发NIOS II软件程序时报错Symbol 'NULL' could not be resolved问题的解决方法 近期在评估使用NIOS II处理器进行项目的 ...

  3. Admob(6.12.x)符号未定义错误的解决方法(IOS)

    在升级Admob的SDK版本到6.12.x时, 按照官方文档操作(https://developers.google.com/mobile-ads-sdk/docs/#ios), 添加如下framew ...

  4. NDK xxxxx could not be resolved解决方法

    Type '*****' could not be resolved Method '******' could not be resolved     问题解决   以下为未尝试方法,如果上面方法解 ...

  5. Kernel Panic常见原因以及解决方法

    Technorati 标签: Kernel Panic 出现原因 1. Linux在中断处理程序中,它不处于任何一个进程上下文,如果使用可能睡眠的函数,则系统调度会被破坏,导致kernel panic ...

  6. QT4项目升级到QT5遇到的问题和解决方法

    QT4升级到QT5改动: PC部分: [改QTDIR变量] 在工程根目录下找到.user文件, 如InnoTabPlugin.vcxproj.user 修改指向你的QT5根目录: <Proper ...

  7. ASIHTTPRequest开源类项目导入问题及解决方法

    在静态库project中加入ASIHTTPRequest导出lib.a.放到project里编译出一下错: Undefined symbols for architecture armv7: &quo ...

  8. OpenCV程序在Debug时出现「PDB文件无法加载」的一个解决方法

    这几天毕设要用到OpenCV,按照网上的教程来搭建开发环境. 用的是OpenCV 3.0 beta + Visual Studio Community 2013.我的系统64位是Win 8.1,但在加 ...

  9. 〖Android〗arm-linux-androideabi-gdb报 libpython2.6.so.1.0: cannot open shared object file错误的解决方法

    执行: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb out/target/p ...

随机推荐

  1. T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...

  2. labview程序性能优化

    课时15: 中级08:LabVIEW运行性能(作者:NI应用工程师 李甫成) 一.避免强制类型转换 二.防止内存泄漏 三.将vi的一部分转化为子vi 四轴项目中所占内存对比,变为子vi后执行速度也快了 ...

  3. Vue(五):Vue模板语法

    1.{{...}}(双大括号) 文本插值 <div id="app"> <p>{{ message }}</p> </div> 2. ...

  4. 如何在 ASP.NET 中(服务器端)主动清除(HTTP内容响应时)浏览器中的 Cookies 数据

    这个 Cookies 设计的好坑...就不写进坑的过程了,直接贴最终解决代码: //清除 cookies 记录 foreach (var key in Request.Cookies.AllKeys) ...

  5. macbook中vagrant升级新版本

    macbook由于缺少卸载机制,有时候不知道该如何升级软件. vagant的升级到时简单,经测试,只需直接官网下载新软件,安装即可. 旧版本不用管,新的会直接替换.

  6. 不存数据库生成验证码(totp算法)

    以前做验证式的方法都是new Random().Next(10000,99999) 生成随机数了以后存到数据库中的用户表中,用户输入验证码了再查询用户表做比较的,网友说这种做法太LOW B了,应该用T ...

  7. 4-4-串的KMP匹配算法-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第4章  串 - KMP匹配算法 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

  8. 2-7-集合运算(A-B)∪(B-A)-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第2章  线性表 - 集合运算(A-B)∪(B-A) ——<数据结构>-严蔚敏.吴伟民版        ★有疑问先阅读★ 源码使用说明  链接☛☛☛ <数据结构-C语言 ...

  9. Win7 下面升级VS2017 vs_community install Microsoft.Windows.D3DCompiler.Msu.Win7

    因为.NET Framework 4.7 WPF 功能采用D3DCompiler_47.dll依赖项.默认情况下,此 D3DCompiler_47.dll 并不是存在于 Windows 7 SP1,W ...

  10. 【设计模式】装饰器模式与Java Servlet、Spring Session在其中的使用

    简述 装饰器模式,可以通过装饰器类,通过依赖原实现的方式(不使用继承),达到扩展原实现的目的.UML图如下: ServletRequestWrapper于其中的使用 ServletRequestWra ...