3

整个应用程序的结构:

  1. 共享库说-low_level.so。
  2. 静态库说 - high_level.a。这个静态库通过调用 dlopen 函数(用于加载 low_level.so)和 dlsym 函数(用于获取将该符号加载到内存中的地址)来使用“low_level.so”。
  3. 应用程序(带有“main”函数)-该应用程序链接“high_level.a”静态库,该库在内部调用“low_level.so”库中所需的函数。

当前场景(工作/不工作)

  1. 上述结构适用于我不使用 lcov/gcov 工具进行代码覆盖的情况。
  2. 我成功地使用了 lcov/gcov 工具来获取“high_level.a”静态库的代码覆盖率。
  3. 我尝试使用上述结构中的 lcov/gcov 获取“low_level.so”共享库的代码覆盖率,但没有成功,以下是尝试过的步骤和看到的错误:

    • 在编译“low_level.so”库时添加了“-fprofile-arcs”“-ftest-coverage”标志。并创建了图书馆。

    • 为“high_level.a”库的编译添加了“-coverage”选项。并创建了图书馆。

    • 为应用程序添加了“LFLAGS=-lgcov -coverage”(带有“main”功能)。并创建了可执行应用程序。

    • 现在,当我尝试执行上述编译的应用程序时,我得到以下 dlopen 错误:could not dlopen: /home/test/libXXX.so: undefined symbol: __gcov_merge_add

问题?:

  1. 这是否意味着 dlopen 不能与 lcov/gcov 一起使用,我们需要实际链接静态库中的共享库(通过更改相同的当前静态库代码)?或者为了使 lcov/gcov 与 dlopen 一起工作,我有什么需要做的吗?

注意:所有代码都在“C”中。

仅供参考,我搜索了相同的内容并发现了一些类似的问题,但仍然落后于选定的最佳答案: 如何找到使用 dlopen() 打开的库的覆盖范围? 除了不使用 dlopen 的选项之外,网上也没有好的指针。

4

2 回答 2

1

我通过将 -lgcov 添加到共享库链接来解决这个问题。

于 2016-07-30T04:37:54.940 回答
0

感谢 Mat 提供一些意见和想法。

内联并做了一些试验和错误,我终于能够通过在编译“low_level.所以'图书馆。

于 2013-09-17T08:29:00.267 回答