在C项目中使用C ++库会导致一长串错误

时间:2013-03-11 12:43:13

标签: c++ c eclipse gcc mingw

我有 C Project ,它使用 C ++库。但是,如果我编译C项目,我会得到一个很长的“未定义的XY参考”错误列表。

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

编译时的错误:

In function `<c function>':
implicit declaration of function `<function>'
[...]

(列表简称)
其中&lt; c function&gt; 是来自C Project的调用函数,&lt; function&gt; 来自C ++库的函数。

链接时的错误:

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"块包围:

#ifdef  __cplusplus
extern "C"
{
#endif

    void example();

#ifdef  __cplusplus
}
#endif

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

编译器 C ++库使用 g ++ 编译, C项目使用 gcc < / strong> - 均来自 MinGW

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

请注意-lstdc++标记。

注意:

  • C项目仅包含.c.h个文件 - 没有.cpp
  • 将“虚拟”cpp文件放入所声明的here中无法正常工作
  • MinGW和Eclipse CDT Indigo
  • C ++库的名称类似于lib<NAME>.a - 它与-l<NAME>相关联,搜索路径已设置。


编辑:

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

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位于c ++库的nm中。


实施例

这部分在Library(C ++)中:

Test.h - 标题

#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 ++部分的实现

#include "Test.h"


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

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


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

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

#include "Test.h"

void doTest()
{
    invoke();
}

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

#include "Test.h"


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

    return 0;
}

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

顺便说一下。这是我为这个例子得到的错误:

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++标志我得到“仅”这些:

Test.cpp:(.text+0x64): undefined reference to `_Unwind_Resume'
Test.cpp:(.eh_frame+0x6b): undefined reference to `__gxx_personality_v0'

2 个答案:

答案 0 :(得分:4)

这个问题看起来像是MinGW GCC中的一个错误。

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

同时确保-lstdc++-l标志的最后(!)

答案 1 :(得分:1)

将您的项目与g ++而不是gcc链接。 G ++将负责必要的c ++运行时实现中的链接。