読者です 読者をやめる 読者になる 読者になる

明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

clang でカバレッジ計測

clang+llvm と CppUTest を使って、組み込み向けのUT環境をつくろうとしているが、カバレッジ計測を行う場合は、CppUTestも clang+llvmコンパイルしておかないと、リンクできなくなる!?

  • CppUTest → gcov をリンクしようとする
  • テストコード → clang_rt.profile-xxx をリンクしようとする

という状況になる模様。

CppUTestの組み込み機能を利用せずにカバレッジ計測を行えばいいのかもしれないけど。。。

まずは CppUTest の使い方を勉強しているので clang+llvm は諦めるかな。

ほとんどのライブラリでは影響が無いのだろうけど、こういったコンパイラのミスマッチによるリンクエラーが出る可能性があるということは clang+llvm を利用する上では意識する必要がありそう。


  • gcov のみリンクした場合
/path/to/source/xxxx.c:(.text+0x232): `llvm_gcda_start_file' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x258): `llvm_gcda_emit_function' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x26c): `llvm_gcda_emit_arcs' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x28d): `llvm_gcda_emit_function' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x2a1): `llvm_gcda_emit_arcs' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x2c2): `llvm_gcda_emit_function' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x2d6): `llvm_gcda_emit_arcs' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x2f7): `llvm_gcda_emit_function' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x30b): `llvm_gcda_emit_arcs' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x310): `llvm_gcda_summary_info' に対する定義されていない参照です
/path/to/source/xxxx.c:(.text+0x315): `llvm_gcda_end_file' に対する定義されていない参照です
  • clang_rt.profile-x86_64 と gcov をリンクした場合
/opt/toolchains/clang+llvm/lib/clang/3.7.0/lib/linux/libclang_rt.profile-x86_64.a(GCDAProfiling.c.o): 関数 `__gcov_flush' 内:
GCDAProfiling.c:(.text.__gcov_flush+0x0): `__gcov_flush' が重複して定義されています
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcov.a(_gcov.o):(.text+0x20d0): ここで最初に定義されています
clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [tests/console_test] エラー 1
make[1]: *** [tests/CMakeFiles/console_test.dir/all] エラー 2
make: *** [all] エラー 2
  • clang_rt.profile-x86_64 のみリンクした場合
/opt/toolchains/cpputest/lib/libCppUTest.a(MemoryLeakWarningPlugin.cpp.o): 関数 `_GLOBAL__sub_I_65535_0__Z44cpputest_malloc_location_with_le
ak_detectionmPKci' 内:
/home/workbench/public/workspace/cpputest-3.6/include/CppUTest/TestFailure.h:113: `__gcov_init' に対する定義されていない参照です
/opt/toolchains/cpputest/lib/libCppUTest.a(MemoryLeakWarningPlugin.cpp.o):(.data+0xc0): `__gcov_merge_add' に対する定義されていない参照です
/opt/toolchains/cpputest/lib/libCppUTest.a(CommandLineTestRunner.cpp.o): 関数 `_GLOBAL__sub_I_65535_0__ZN21CommandLineTestRunnerC2EiPPKcP10T
estOutputP12TestRegistry' 内:
...