注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

ubuntuX64编译动态库时的注意点  

2016-01-12 17:30:59|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
ubuntuX64编译动态库时的注意点
在Xcode4下编译一个动态库时遇到下面的问题:
g++ -fPIC -shared  -o libikir.so dipImageProc.o edEyelidDetection.o feFeatureExtraction.o fmFeatureMatcher.o IK_IR_DLL.o nmNormalization.o pfPupilFinder.o qeQualityEvaluator.o sgSegmentation.o
/usr/bin/ld: dipImageProc.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
dipImageProc.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
其实就是下面的错误:
relocation R_X86_64_32 against `.rodata‘ can not be used when making a shared object; recompile with -fPIC错误。
提示的很清楚,在编译一个共享目标时,得增加-fPIC,但是在X32的经验告诉在编译时增加这个选择就可以了,如下:
两个标记:
CFLAGS=-Wall -g -pthread  -std=c++11
LDFLAGS= -fPIC -shared
实际使用
$(CPP) -c $(CFLAGS) $< -o $@
$(CPP)  $(LDFLAGS) -o $(LIB) $^
这里面有一个小插曲,原来的Makefile写的-fPCI,但是也不报错,可见在32位的情况下,编译还是比较宽松的。
在这里加上-fPCI这个选项后,结果发现,还是报这个错误,都无语了,反复检查,没有问题。只好查了下百度,发现了一个令人非常悲哀的事儿。在编译Object对象时也要增加这个-fPIC,即如下:
$(CPP) -c -fPIC $(CFLAGS) $< -o $@
这个样子后就好了。X64和I386(X32)的区别,就在于此,再次声明一下-fPCI意义:
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的.
  评论这张
 
阅读(200)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017