博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
live555 编译动态库时遇到relocation R_X86_64_32 against `a local symbol'的错误
阅读量:4159 次
发布时间:2019-05-26

本文共 2088 字,大约阅读时间需要 6 分钟。

解决方法:将live555 四个库的makefile全部加上 -fPIC.

$gcc -c hello.c

$gcc -c main.c

$gcc -shared -fPIC -o hello hello.o main.o

.. relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

... could not read symbols: Bad value

解决办法编译器已经提示了:recompile with -fPIC

但是我们应该重新编译谁带上这个参数呢?经过我几番折腾,发现如下情况:

1、编译.o文件的时候,没有加参数-fPIC,(网友说这样的问题在gcc version 3.4.6版本没有发生,即该版本编译器默认加上了-fPIC,未验证过),本人在出现问题时查看了当前系统的gcc版本,为下面红色标记部分。

/home/gateway/priv/yzj/union_183>gcc -v

Using built-in specs.

Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-48))

2、当前程序中有用到某个静态库,那个静态库编译.o文件的时候没有加上-fPIC(静态库其实就是.o文件打包)。补充一点:我发现手写Makefile时即使不加-fPIC也没有这个问题,这一点很郁闷,这个只在用automake工具编译出.a文件时才出现过。

原因:某些版本的gcc默认没加-fPIC参数

解决办法:保证你编译.o文件的时候,都加上-fPIC,这样你才能编译出动态库来

$gcc-fPIC -c hello.c

$gcc-fPIC -c main.c

$gcc -shared -fPIC -o hello hello.o main.o

这样能顺利生成hello.

补充说明:以上问题的出现是基于看到“红黑联盟网站上的一篇关于链接及库讲解”文章中列举出的案例,文中作者在论述时是用本文开头的方法来编译且能成功,但本人在做测试时发现存在问题故而写下此篇,该文章链接地址如下。

file:///H:/%E5%8F%82%E8%80%83%E7%AC%94%E8%AE%B0/%E7%8B%AC%E7%AB%8B%E6%80%A7%E8%B5%84%E6%96%99/%E7%BE%A4%E9%87%8C%E8%B5%84%E6%96%99%E6%94%B6%E9%9B%86/%E5%8A%A8%E6%80%81%E5%BA%93%E7%B3%BB%E5%88%97/[Linux]%E9%93%BE%E6%8E%A5%EF%BC%8C%E9%9D%99%E6%80%81%E5%BA%93%E5%92%8C%E5%8A%A8%E6%80%81%E5%BA%93%20-%20%E5%85%B6%E4%BB%96%E7%BB%BC%E5%90%88%20-%20%E7%BA%A2%E9%BB%91%E8%81%94%E7%9B%9F.htm

程序清单

1.main.c

int main() 

hello("everyone"); 
return 0; 

2.hello.c

#include <stdio.h> 

void hello(const char *name) 
{
printf("Hello %s!/n", name); 
}

3.hello.h

#ifndef HELLO_H 

#define HELLO_H 
 
void hello(const char *name); 
 
#endif //HELLO_H 

转载地址:http://hpdxi.baihongyu.com/

你可能感兴趣的文章
python循环语句与C语言的区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>