1

ac b.cpp ファイルがあります。

/****** a.c ******/
fun1(...)
{
     ..........

     fun2(...); /* function present in b.cpp */

     ..........
}

/******* b.cpp *******/
extern "C" int fun2(...);
int fun2(...)
{
    ..........

}

次のようにコードをコンパイルしました。

a.o:a.c b.o
    gcc -c -o a.o a.c b.o

b.o:b.cpp
    g++ -c -o b.o b.cpp

しかし、「fun2()」への未定義の参照としてエラーが発生しています。これは正しいコンパイル方法ですか、何か変更する必要がありますか?

4

3 に答える 3

5

関数のプロトタイプを ac に追加する必要があります

于 2013-07-15T05:22:22.597 に答える
3
extern "C" int fun2(...);

関数が定義されているb.cppにその行があり、関数に「C」リンケージを持たせるように指示していますが、acに対応するプロトタイプがなく、関数が存在することを伝えています。

/****** a.c ******/
extern int fun2(...);
fun1(...)
{
     ..........

     fun2(...); /* function present in b.cpp */

     ..........
}

それを修正します。またはヘッダーに入れる

// b.h
#pragma once

// tell c++ you want these externs to have C linkage
#ifdef __cplusplus
extern "C" {
#endif

// list your "C" accessible functions here.
extern int fun2(...);

// end the extern scope
#ifdef __cplusplus
};
#endif

// a.c
#include "b.h"

// b.cpp
#include "b.h"
于 2013-07-15T05:23:12.983 に答える
1

オブジェクトファイルからオブジェクトファイルを作成するのはなぜですか? bo を ao にリンクする必要はありません。対応する c から各オブジェクトを構築し、最後にすべてをリンクするだけです (main() 関数を使用)。

于 2013-07-15T05:30:07.127 に答える