recompile with -fPIC
故事背景
最近同事遇到一个比较奇怪的问题,直接开门见山吧。在动态库中调用静态库直接报错了recompile with -fPIC
,查看cmake的写法也没有问题,而且也是第一次遇见这个问题,所以就开启了我的好奇之路。
探索之路
- 说实话我不喜欢百度,因为千篇一律,你抄我的我抄你的,没有任何参考价值,直接google吧,都是一些英文的解析文档,基本上都能解决你遇到的问题。
Briefly, the error means that you can't use a static library to be linked w/ a dynamic one.
这句话我就不翻译了。- The solution was to compile everything with
-fPIC
, and link shared objects with-shared
.Add-fPIC
toCFLAGS
orCXXFLAGS
for make-based projects.这句也不翻译了,我觉得还是看英文比较好理解,翻译出来没有那个感觉。
经验心得
In a word
- 动态库中不可以链接静态库
- 如果想在动态库中链接静态库,需要加上
-fPIC
重新编译静态库,然后再在动态库中链接就可以了。 - 查看是不是添加了-fPIC的命令:
readelf -d xxx.so | grep TEXTREL
- cmake中直接设置
set(CMAKE_CXX_FLAGS "-fPIC")
大家有兴趣的可以自行了解下-fPIC
的作用。
走的太远不要忘记为什么出发,你的态度决定你的高度。
分类:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义