3

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

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

编译时出错:

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

(短列表)
其中<c function>是来自 C Project 的调用函数,而<function>是来自 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 - 两者都来自MinGW

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

请注意-lstdc++国旗。

笔记:

  • C 项目仅包含.c.h文件 - 没有.cpp
  • 像这里所说的那样放置一个“虚拟”cpp文件不起作用
  • MinGW 和 Eclipse CDT 靛蓝
  • 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'
[...]

(名单缩短)

例如。在 c++ 库_Unwind_Resume中可用。nm


例子:

这部分在库(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'
4

2 回答 2

4

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

  • 使用GCC 3.4.5错误如上所示
  • 使用GCC 4.7.2没有错误

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

于 2013-03-12T10:50:03.737 回答
1

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

于 2013-03-11T12:48:11.783 回答