3

問題を説明するために、いくつかの簡単な基本コードを作成しました。

header.h:

#ifdef __cplusplus
#   define API extern "C"
#else
#   define API
#endif

void callback();
API void libFunction();

testlib.c:

#include "header.h"

void libFunction()
{
    Callback();
}

私はこれを次のような静的ライブラリとしてコンパイルします:

gcc -c testlib.c
ar rsc libtest.a testlib.o

次に、私のサンプルc++コードは

main.cpp:

extern  "C"{
#include  <lib/header.h>
}
#include  <stdio.h>

main()
{
    libFunction();
}

void Callback()
{
    printf("Callback is called \n");
}

そして私は自分のexeファイルをそのように構築しようとします

g++ -I. -L. main.cpp -ltest

次のエラーが発生します

./lib/libtest.a(testlib.o): In function `libFunction':
testlib.c:(.text+0x7): undefined reference to `Callback'
collect2: ld returned 1 exit status

私は文字通り一日中、その理由を理解しようと努めてきました。誰か助けてもらえますか?

4

1 に答える 1

3

Cファイルから呼び出す場合は、C ++ファイルCallbackに組み込む必要がありextern "C"ます。そうしないと、C++の名前マングリングによってシンボルが整列しなくなります。Callback()inの定義を次のように変更する必要がありmain.cppます。

extern "C" void Callback()

ケースの不一致もあります。ヘッダーのプロトタイプにはと書かれていますcallbackが、それ以外の場所では。を使用しますCallback。コードを読み直すと、このケースの不一致を修正するだけですべての問題が解決すると思います。私は最初の読書でextern "C"ラッパーを見ませんでした。#include <lib/header.h>

于 2013-02-12T20:55:59.487 に答える