整个应用程序的结构:
- 共享库说-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 错误:could not dlopen: /home/test/libXXX.so: undefined symbol: __gcov_merge_add
问题?:
- 这是否意味着 dlopen 不能与 lcov/gcov 一起使用,我们需要实际链接静态库中的共享库(通过更改相同的当前静态库代码)?或者为了使 lcov/gcov 与 dlopen 一起工作,我有什么需要做的吗?
注意:所有代码都在“C”中。
仅供参考,我搜索了相同的内容并发现了一些类似的问题,但仍然落后于选定的最佳答案: 如何找到使用 dlopen() 打开的库的覆盖范围? 除了不使用 dlopen 的选项之外,网上也没有好的指针。