gcc报错 can not be used when making a shared object; recompile with -fPIC
使用google protobuf时,出现错误
/usr/bin/ld: /usr/local/lib/libprotobuf.a(message_lite.o): relocation R_X86_64_32S against `_ZTVN6google8protobuf11MessageLiteE' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libprotobuf.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
搜了下,几篇文章如下:
查看整个编译过程,编译过程中看到没有-fPIC选项,如何加进去
看protobuffer的README和INSTALL文档,看到需要添加特殊编译选项,需要在执行configure的时候引入,
于是make clean; make uninstall
./configure CXXFLAGS=-fPIC
查看编译文件,发现已经有了编译选项-fPIC,再次执行编译安装
重新编译程序,这次没有报错,没有出错,问题解决。
另外回答;
原因:
-fPIC 是个神马东东呢?
选项 -fPIC
PIC是Position-Independent-Code的缩写。在计算机系统中,PIC和PIE(Position-IndependentExecutable)是可以在主存中不同位置执行的目标代码。PIC经常被用在共享库中,这样就能将相同的库代码为每个程序映射到一个位置,不用担心覆盖掉其他程序或共享库。
因为so动态库编译的时候加上了 -fPIC,但是连接的 libprotobuf.a文件并不是 -fPIC生成的,所以就报错了。
那就是说连接的 libprotobuf.aa 文件,也需要加上 -fPIC 选项进行编译了。
关于-fPIC:http://blog.sina.com.cn/s/blog_54f82cc201011op1.html
/usr/bin/ld: libs/X86_64/libglog.a(libglog_la-logging.o): relocation R_X86_64_32S against `_ZTVN6google4base6LoggerE' can not be used when making a shared object; recompile with -fPIC libs/X86_64/libglog.a: could not read symbols: Bad value collect2: error: ld returned 1 exit status
只能安装错误提供的方法重现编译libglog.a了,然后,替换了libglog.
CXXFLAGS="-O3 -fPIC" ./configure --prefix=glog-0.3.3/install
参考:http://zrj.me/archives/1066
最新文章
- CSS兼容各浏览器的hack
- Guid.NewGuid().ToString()的几种格式
- Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。
- HDU 4932 贪心
- An exception occurred during configuration of persistence layer.
- Activiti 5.18 流程Model 转成 流程BPMN文件
- QNX---Interrupt vector numbers(原创!!!)
- C#集合的应用以及和数组比较,它的好处有哪些
- IDEA for Mac注册码使用
- Jmeter_实现操作postgresql数据库
- dubbo 调用服务超时
- Effective Java 第三版——66. 明智谨慎地使用本地方法
- 制作Wi-Fi Ducky远程HID攻击设备
- ADO.NET获取数据(DataSet)同时获取表的架构
- 数据库索引和SQL语句使用经验
- 实现mysql按月统计的教程
- Python中的is和==的区别,==判断值是否相等,is判断地址是否一致
- ubuntu 下 重启 mongo 后 遇到蛋疼问题。
- OpenGL核心之SSAO技术解说(一)
- [BZOJ4240]有趣的家庭菜园(贪心+树状数组)