3

C++ライブラリを使用するCプロジェクトがあります。ただし、Cプロジェクトをコンパイルすると、「XYへの未定義の参照」エラーの長いリストが表示されます。

これらのエラーは、C++参照が原因で発生します。

コンパイル中のエラー:

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

(リストの短縮)
ここで、< cfunction>はCProjectからの呼び出し関数であり、<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

(多くのエラー-例がショート)

extern "C"静的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およびEclipseCDTIndigo
  • 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();
}

さて、ここに2番目のプロジェクト(純粋なC)の一部があります:

#include "Test.h"


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

(1):そのインクルードを削除すると、Cプロジェクトをコンパイルできます。ただし、あらゆる種類のクラスまたはC ++のものに1つのインクルードを追加すると、リンク中に多くのエラーが発生します。残念ながら、クラスなどを含める必要があります。

ところで。この例で発生するエラーは次のとおりです。

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

この問題は、MinGWGCCのバグのように見えます。

  • GCC 3.4.5の使用:上記のエラー
  • GCC 4.7.2の使用:エラーなし

また、フラグの最後(!)-lstdc++であることを確認してください。-l

于 2013-03-12T10:50:03.737 に答える
1

プロジェクトをgccではなくg++にリンクします。G ++は、必要なc++ランタイム実装でのリンクを処理します。

于 2013-03-11T12:48:11.783 に答える