我写了一个包含一些静态方法的C ++类,我用它在Linux下构建一个库作为动态库
然后我编译了一个使用相同类的应用程序,它还链接了以前编译的动态库。通过这种方式,我的应用程序可以在动态库中使用该类
当应用程序运行时,当动态库的函数调用类的静态方法时会导致分段错误:使用gdb查看堆栈跟踪它似乎是内存损坏,因为错误非常奇怪。
我怀疑问题是对静态函数的调用,因为他的地址显示在gdb堆栈跟踪中是可执行二进制文件中符号的地址而不是库.so文件中的符号地址。 (我使用nm工具检查了地址)
应用程序调用该函数的“错误”版本
应用程序可以看到两个相同的函数副本:应用程序二进制文件中的一个符号和动态库文件中的一个符号(相同符号)
我的问题是:
- 如何区分应用程序和库项目中的函数调用? (考虑到具有静态函数的类是两个项目的相同源)
- 为什么在编译应用程序时,链接器不报告重复符号的错误?
醇>
由于
更新详情
- 尝试编译应用程序而不编译库使用的类可以很好地工作。
- 应用程序需要编译该类,因为之后它将被调用,但现在它 NOT 使用它。只有链接的库才会使用它。
- 该类的静态方法调用C函数(使用 extern“C”声明)。我试图在库中定义一个名称空间,但没有成功。现在调用的静态函数是正确的,因为符号使用命名空间具有不同的名称,但函数内部调用没有命名空间的全局 C方法,因此分段错误同样发生,因为它调用了错误的 C函数。
- 我不明白为什么它会在应用程序调用错误的函数(自己的版本而不是库版本)时崩溃。这些函数是相同的,只能由库调用(应用程序不会调用它)。调用什么函数应该没有区别。