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. Android自己定义view之measure、layout、draw三大流程

    自己定义view之measure.layout.draw三大流程 一个view要显示出来.须要经过測量.布局和绘制这三个过程,本章就这三个流程具体探讨一下.View的三大流程具体分析起来比較复杂,本文 ...

  2. 关于thymeleaf+layout布局的使用方式,spring boot 访问页面(静态页面及jsp页面)

    首先建立相同部分的html,这里我命名为layout.html,放在了`templates/layout'文件夹下,这个路径以后是会用到的,以下是我的layout的代码,比较粗糙. 但是应该会更好的帮 ...

  3. struts2 常量

    struts.i18n.encoding 指定web应用的默认编码集

  4. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  5. Linux 密码过期(WARNING:Your password has expired )

    最近遇到两次这个问题,我们公司用的是开源的堡垒机Jumpserver但是最近有两个同学遇到了 WARNING:Your password has expired 第一次遇到这个问题也没有往深了去查,当 ...

  6. 在 Windows 7 中安装 .NET Framework 时遇到错误:无法建立到信任根颁发机构的证书链

    当全新安装 Windows 7 SP1 后,在未安装任何补丁,也未进行联网的状态下,安装 .NET Framework 4.6 或更高的版本时,应该会遇到错误提示:无法建立到信任根颁发机构的证书链. ...

  7. 源码解析-EventBus

    示例使用 时序图 源码解读 EventBus 使用 官网定义:EventBus 是一个使用 Java 写的观察者模式,解耦的 Android 开源库.EventBus 只需要几行代码即可解耦简化代码, ...

  8. EMIT 动态创建类型

    https://www.cnblogs.com/xiaodlll/p/4029051.html  值得一读

  9. Shell中整数比較

    -eq             等于,如:if ["$a" -eq "$b" ] -ne             不等于,如:if ["$a" ...

  10. localtime 和 localtime_r

    #include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> ...