【发布时间】:2013-09-16 20:52:15
【问题描述】:
整个应用的结构:
- 说共享库 - low_level.so。
- 说静态库 - high_level.a。这个静态库通过调用 dlopen 函数(用于加载 low_level.so)和 dlsym 函数(用于获取该符号加载到内存中的地址)来使用“low_level.so”。
- 应用程序(带有“main”函数)- 此应用程序链接“high_level.a”静态库,该库在内部调用“low_level.so”库中所需的函数。
当前场景(工作/不工作)
- 上述结构适用于我不使用 lcov/gcov 工具进行代码覆盖的情况。
- 我成功使用 lcov/gcov 工具获取了“high_level.a”静态库的代码覆盖率。
-
我尝试使用上述结构中的 lcov/gcov 获取“low_level.so”共享库的代码覆盖率,但没有成功,以下是尝试过的步骤和看到的错误:
在编译“low_level.so”库时添加了“-fprofile-arcs”“-ftest-coverage”标志。 并创建了库。
为“high_level.a”库的编译添加了“-coverage”选项。并创造了 图书馆。
为应用程序添加了“LFLAGS=-lgcov -coverage”(带有“main”功能)。和 创建了可执行应用程序。
现在,当我尝试执行上述编译的应用程序时,出现以下错误 打开: 无法 dlopen:/home/test/libXXX.so:未定义符号:__gcov_merge_add
问题?:
- 这是否意味着 dlopen 不能与 lcov/gcov 一起使用,我们需要实际链接静态库中的共享库(通过更改相同的当前静态库代码)?或者,为了使 lcov/gcov 与 dlopen 一起工作,我还有什么需要做的吗?
注意:所有代码都在“C”中。
仅供参考,我搜索了相同的内容并发现了一些类似的问题,但仍然落后于选定的最佳答案: How to find the coverage of a library opened using dlopen()? 除了不使用 dlopen 的选项之外,网上也没有好的指针。
【问题讨论】:
-
我不知道答案,但似乎问题是
__gcov_merge_add是必需的,dlopen 不会尝试在“主”应用程序中找到它,而是在另一个图书馆。也许您需要将其静态链接到您的“low_level.so”? -
感谢垫子的想法。 'low_level.so' 被'high_level.a' 调用。我尝试在编译“high_level.a”时添加 -coverage 选项。但是 dlopen 仍然没有捡起它。无论如何,“主”应用程序只是调用'high_level.a'的函数,而不是直接调用'low_level.so'的函数。
-
我的意思是,覆盖功能似乎需要与 low_level.so... 但我不知道这是如何工作的,我只是从错误中解释您收到的消息。
-
感谢 cmets,Mat。
标签: c code-coverage dlopen gcov lcov