6

Cmockeryを使用して、テスト中の C++ コードから呼び出される C 関数をモックできるようにしたいと考えています。そのためのステップとして、Cmockery の例の名前をrun_tests.cから run_tests.cpp に変更し、コンパイルして cmockery.c とリンクしようとしています。

g++ -m32 -DHAVE_CONFIG_H -DPIC -I ../cmockery-0.1.2 -I /usr/include/malloc -c run_tests.cpp -o obj/run_tests.o
gcc -m32 -DHAVE_CONFIG_H -DPIC -Wno-format -I ../cmockery-0.1.2 -I /usr/include/malloc -c ../cmockery-0.1.2/cmockery.c -o obj/cmockery.o
g++  -m32 -o run_tests obj/run_tests.o obj/cmockery.o

最初の 2 つのコマンド ライン (コンパイル用) は成功していますが、最後のコマンド ラインの後は次のようになります。

Undefined symbols:
  "_run_tests(UnitTest const*, unsigned long)", referenced from:
      _main in run_tests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

その未定義のシンボルは、run_tests.cpp の 29 行目からのものです。

return run_tests(tests);

run_tests() 関数は cmockery.c で定義されています。

「「gcc」を使用した C++ コードのリンク (g++ なし) 」を読んだ後、次のことを試しました。

gcc -lstdc++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o

しかし、同じ結果を得ました:

Undefined symbols:
  "_run_tests(UnitTest const*, unsigned long)", referenced from:
      _main in run_tests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

C++ コードをコンパイルおよびリンクして、C コード内のシンボルを検出するにはどうすればよいですか?

4

4 に答える 4

7

cmockery.h ファイルの内容の周りに次を追加することで、C++ から thinkgs をリンクさせることができると思います。

冒頭またはその付近:

#if defined(__cplusplus)
extern "C" {
#endif

終了時または終了間際:

#if defined(__cplusplus)
}
#endif

そうすれば、C ソースでヘッダーを使用すると宣言の一部が無視されますがextern "C"、ヘッダーが C++ ビルドにインクルードされると、そのヘッダーの宣言のリンケージが C セマンティクスを使用することがコンパイラに適切に通知されます。

簡単なテストの場合、またはヘッダーを変更したくない場合は、次を試すことができます。

extern "C" {
#include "cmockery.h"
}

しかし、私の好みは、extern "C"ブロックをヘッダーに配置することです(必要なものの周りにのみ-少し分析が必要になる場合があります)。

于 2011-01-04T21:24:27.223 に答える
5

extern "C"C++ コードに含まれるヘッダー ファイルでは、Cでコンパイルされるすべての関数の宣言が必要です。

于 2011-01-04T20:58:50.830 に答える
2

C++ から C ヘッダー ファイルをインクルードするとき、プロトタイプを でラップしましたextern "C" { .... }か? そうしないと、リンク時に C++ 関数名が「マングル」されます。

于 2011-01-04T20:59:36.617 に答える
2

カールが言ったように、extern "C" { .. }必要です。

理由: C++ は、リンクがタイプ セーフになるように名前をマングル (変な文字を追加) します。C はそうではないので、その言語では へのリンクfoo(int)foo(double)可能です (しかし、間違っていて恥ずかしいです)。

相互運用性を成功させるには、リンクを成功させるために、一部の関数名がマングルされないように C++ コンパイラに指示する必要があります。

于 2011-01-04T21:01:29.820 に答える