作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试向需要使用 C++ 库的大型 C 项目添加一些代码。
C++ 库使用标记为 extern "C"的函数提供了一个包装器,该函数提供对库功能的访问
//Some C++ library
//mywrapper.h
#ifdef __cplusplus
extern "C" {
#endif
void wrapperFunction1( int width );
void wrapperFunction1( int height);
#ifdef __cplusplus
} // extern "C"
#endif
用 g++ 编译没有问题。
在编写 C 程序并包含 mywrapper.h 时,我不断收到引用 vtable 和 cxa_pure_virtual 的链接器错误:
undefined reference to `vtable for __cxxabiv1::__class_type_info'
undefined reference to `__cxa_pure_virtual'
在测试中,当我添加 stdc++ 库时,这些错误消失并允许程序编译,但这不是较大的 C 项目的选项。有没有办法编译 C 程序以访问 C++ 库而没有这些错误并且没有 stdc++?错误的处理指的是 C++ 库深处的模块,而不是在 mywrapper.h 中引用的模块,那么为什么 C 程序甚至试图引用它们呢?
最佳答案
C++ 库依赖于标准 C++ 库(libstdc++,链接器的 -lstdc++
选项,如果您通过 g++
运行链接器则默认)。这是事实。对此无能为力。克服它。
包装器 header 不引用那些符号,而是库中的实际对象文件 do。因此需要定义它们,定义它们的方法是包含标准 C++ 库。
请注意,如果包装的库本身是动态的,它将知道它的依赖关系,并且您不必动态指定针对 libstdc++ 的链接。
关于c++ - 如何在不需要 stdc++ 链接的情况下将 C 程序连接到 C++ 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9019098/
我是一名优秀的程序员,十分优秀!