动态加载的PIC共享库具有来自NPIC依赖项的运行时未解析符号
Dynamically loaded PIC shared library has runtime unresolved symbols from NPIC dependency
这是我的情况
我有一个共享库(PIC(foo.so。它使用bar.a中的符号。bar.a是NPIC。因此无法添加到foo.So.的链接行
foo.so是从main动态加载的。C它加载良好,但在运行时,当使用bar.a中的符号时,它会带着未解析的符号退出。
有人向我提出了2个解决方案1.编译bar.aPIC并将其添加到foo.so的链接行2.在main上使用"-Wl,--whole archive bar.a-rdynamic"。C链路
1是不可能的,因为bar.a是第三方库。2是不可能的,因为我们不希望我们的符号被导出。
有没有其他的习惯用法/解决方案可以解决这个问题?
"1不可能,因为bar.a是第三方"。
这听起来不对。任何静态库都可以链接。就是这个成语。还可以看看这个答案和这个
有一个古老的好习惯用法。我称它为"libgcc.so idiom"
,因为它经常用于普通的libgcc构建,当您从libgcc.a 创建libgcc_s.so时
带你去酒吧.a,用这句话做酒吧.so:
gcc -shared -o bar.so -Wl,--whole-archive bar.a -Wl,--no-whole-archive
你可能还需要提供-nostdlib
之类的东西
现在去链接foo.so和这个新的bar.so
现在,当加载foo.so时,所有依赖项都将由动态链接器解析。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 模型依赖关系目标,在运行时链接
- 如何在 Linux 上将所有第三方运行时依赖项包含在 cmake/cpack 生成的包中
- 使用运行时dll(/MD)避免与dll的运行时依赖关系
- Visual Studio 2015 运行时依赖项或如何摆脱通用 CRT
- 运行时的库依赖项
- c++中的运行时模板依赖
- 动态加载的PIC共享库具有来自NPIC依赖项的运行时未解析符号
- Windows运行时库依赖和纯C代码
- 如何使Visual Studio 2010不包含对MSVC运行时引擎的任何依赖项
- 在运行时检测应用程序的所有依赖项
- 运行时依赖项和生成依赖项概念
- 在运行时检测和拦截链接库依赖项