首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C项目中使用C++库会导致大量错误

在C项目中使用C++库会导致大量错误
EN

Stack Overflow用户
提问于 2013-03-11 12:43:13
回答 2查看 3.8K关注 0票数 3

我有一个C项目,它使用C++库。但是,如果我编译了C项目,就会得到一长串“XY的未定义引用”错误。

这些错误是由C++引用引起的:

编译时错误:

代码语言:javascript
复制
In function `<c function>':
implicit declaration of function `<function>'
[...]

(名单缩短)

来自C项目的调用函数和来自C++库的函数在哪里。

链接时错误:

代码语言:javascript
复制
undefined reference to `std::cerr'
undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
[...]
undefined reference to `__gxx_personality_v0'
more undefined references to `__gxx_personality_v0' follow

(大量错误-示例短路)

在静态C++库中,我的类型/函数包含在extern "C"块中:

代码语言:javascript
复制
#ifdef  __cplusplus
extern "C"
{
#endif

    void example();

#ifdef  __cplusplus
}
#endif

为了确保这一点,所有#include引用的C++库都被这样一个extern "C"块所包围。

编译器: C++库使用g++编译,C项目使用gcc编译,两者都来自MinGW

CL (链接): gcc -L<search-path here> -shared [...] -lstdc++ -l<C++ library set here>

请注意-lstdc++标志。

注:

  • C项目只包含.c.h文件-不包含.cpp
  • 将一个“虚拟”cpp文件放入声明的here中是不起作用的
  • MinGW和
  • C++库有一个类似于lib<NAME>.a的名称-它与-l<NAME>链接,搜索路径被设置。

编辑:

使用g++作为链接器:undefined reference to std::cerr‘’等已经消失,但是我得到了另一个错误列表:

代码语言:javascript
复制
Warning: .drectve `-aligncomm:"___hexdig_D2A",5' unrecognized
undefined reference to `<function / class / method from C++ Library>'
[...]
undefined reference to `_Unwind_Resume'
[...]
undefined reference to `__gxx_personality_v0'
more undefined references to `__gxx_personality_v0' follow
undefined reference to `__chkstk_ms'
[...]

(名单缩短)

例如:_Unwind_Resume可在nm of c++库中获得。

示例:

此部分位于库(C++)中:

Test.h -标头

代码语言:javascript
复制
#ifndef TEST_H_
#define TEST_H_

// --- Pure C++ here ---
#ifdef __cplusplus

#include <string>     /* (1) */
class Test
{
public:
    Test();
    
    
    void aMethod();
    
private:
    int i;
};
#endif

// --- Mixed (C / C++ ) here ---

#ifdef __cplusplus
extern "C"
{
#endif
   
    extern void doTest();
    extern void invoke();
    
#ifdef  __cplusplus
}
#endif

#endif /* TEST_H_ */

Test.cpp - C++部件的实现

代码语言:javascript
复制
#include "Test.h"


Test::Test() : i(0) { }

void Test::aMethod()
{
    this->i++;
}


void invoke()
{
    Test i;
    i.aMethod();
}

Test.c -C接口的实现(仍在库中!)

代码语言:javascript
复制
#include "Test.h"

void doTest()
{
    invoke();
}

现在,下面是第二个项目(纯C)的部分:

代码语言:javascript
复制
#include "Test.h"


int main(int argc, char* argv[])
{
    doTest();
    
    return 0;
}

如果删除了(1):,我可以编译C项目。但是,为任何类型的类或c++添加一个包含会在链接时造成很多错误。不幸的是,我需要包括课程等等。

顺便说一句。下面是我在这个例子中遇到的错误:

代码语言:javascript
复制
Test.cpp:(.text+0x1b): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()'
Test.cpp:(.text+0x64): undefined reference to `_Unwind_Resume'
Test.cpp:(.text$_ZN4TestD1Ev[Test::~Test()]+0x12): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
Test.cpp:(.eh_frame+0x6b): undefined reference to `__gxx_personality_v0'

在(!)之后设置-lstdc++标志我得到的图书馆的旗子“只有”这些:

代码语言:javascript
复制
Test.cpp:(.text+0x64): undefined reference to `_Unwind_Resume'
Test.cpp:(.eh_frame+0x6b): undefined reference to `__gxx_personality_v0'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 10:50:03

这个问题看起来就像MinGW GCC中的一个bug。

  • 使用GCC 3.4.5:上面发布的错误
  • 使用GCC 4.7.2:无错误

还要确保-lstdc++是您的-l标志的最后一个(!)。

票数 4
EN

Stack Overflow用户

发布于 2013-03-11 12:48:11

把你的项目和g++联系起来,而不是gcc。G++将负责在必要的c++运行时实现中进行链接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15338879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档