将--coverage
传递给gcc同时链接LLVM会导致链接器出现undefined reference to
__gcov_exit'`错误。我已经建立了一个新的项目来尝试隔离这个问题。您可以使用view the source on github和inspect the compiler output on Travis-CI。
这就是Coverage和非Coverage构建之间的区别
-DCMAKE_CXX_FLAGS="--coverage"
这是LLVM和非LLVM构建之间的区别
target_link_libraries(Test
PUBLIC
LLVMCore
)
LLVM
作业成功。Coverage
作业成功。LLVM + Coverage
作业失败,并显示此错误
undefined reference to `__gcov_exit'
1条答案
按热度按时间nwlqm0z11#
一开始我认为这是一个微不足道的修复(与 -fprofile-arcs 、-ftest-coverage 、-lgcov * 标记相关的东西),正如[Man7]: GCC(1)(--coverage * 选项)中所指出的那样,但事实并非如此。
我无法在我的 * Ubuntu 16 pc064**VM * 上重现这个问题(虽然 * Travis * 非常好,但对于调试目的来说有点慢(特别是由于匆忙,编辑时可能会忘记或添加额外的字符:)),而且它也不提供与本地计算机相同的访问级别,)因为环境:
与 * Travis**Docker * 映像上的内容相差甚远。我必须指出,我既没有尝试从源代码构建软件包(这可能会引起很多麻烦),也没有尝试从 * CI * 构建期间下载软件包的存储库下载它们(甚至没有检查这些存储库是否是公共的)。
这是吃我活着,所以我结束了建设***48***该死的时间(对 * 特拉维斯 *),以获得它的工作,这只是因为我没有注意到显而易见的。
问题
对于3种配置中的每一种,我将粘贴生成的编译和链接(* G ++)命令(从您的构建版本:[Travis CI]: Kerndog73/gcov_error - Build #24)
1. LLVM *:
1.* 覆盖范围 *:
1.* LLVM + 覆盖范围 *:
在大量的幽灵追逐之后,我注意到当包含 * LLVM * 时,-L/usr/lib/gcc/x86_64-linux-gnu/4.8被传递到链接器。 GCC 4.8是安装在 * Docker * 上的,所以很明显 * GCC7.4用于编译, GCC4.8用于链接,这是*UndefinedB行为 。
我还粘贴了 * Collect * 命令(更靠近链接器),它来自**#3的一个小变体(带有 -v )。(所有带有 *-l但没有完整路径的库(例如,-lgcov 、-lgcc_s 、-lgcc *)都有错误的版本,因为将从错误的目录中选取):
因此,* LibGCC ( libgcov. a )在2个相关版本之间的某处进行了修改(添加了**__gcov_exit符号), G ++* 知道它有一个,但 * Ld * 没有提供(因为错误的 * lib ),因此出现错误。
现在,**为什么LLVM * 要添加这个库搜索路径,我不知道(可能是因为它是用 * GCC 4.8 * 构建的--或者是用与之相近的 * smth * 构建的),但我可以想到的是:
1. LLVM * 不适用于 * GCC 7 (尽管我在快速浏览[LLVM]: Getting Started with the LLVM System时没有发现任何此类限制)
1. LLVM * 中的一个bug(考虑到我遇到的另一个问题,我倾向于认为这是赢家)
我为他们找到了方法:
export CXX=g++
(甚至可能不需要)