英特尔代码覆盖率 - >对`std :: string :: _ S_compare(unsigned long,unsigned long)的未定义引用

时间:2016-06-29 12:33:29

标签: compare code-coverage intel libstdc++

我使用带有标志-prof-gen:srcpos的intel编译器icc / icpc在Redhat 6下编译代码,以便执行代码覆盖率分析。这适用于我的代码的某些部分,但我在一些库中有问题。

我收到错误

    undefined reference to std::string::_S_compare(unsigned long, unsigned long)

我再次链接/ usr / lib64 / libstdc ++。so.6.0.13。

不幸的是,我无法识别可以编译的代码与不能编码的代码之间的区别。一个不编译的lib是静态构建和链接的。

最好的问候,格奥尔格

2 个答案:

答案 0 :(得分:0)

我使用的是intel编译器版本15.0.3 20150407和4.4.7 20120313(Red Hat 4.4.7-17)。

更新到gcc 4.8.2 20140120后,它运行正常。在旧的gcc版本中,未提供所需的功能。

答案 1 :(得分:0)

我一直在努力解决同样的错误。下面是一个修复程序,可以在RHEL5和RHEL6上编译相同的代码,而不会在生成英特尔报告报告时获得您列出的错误。只需将此代码段放在编译器抱怨缺少符号的.cpp文件中。

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// NOTE: The block below is ONLY needed for building with the
//       Intel code-coverage flags turned on. For some reason,
//       this comes up as an un-resolved symbol. So, for CODE
//       COVERAGE BUILDS ONLY, this symbol is defined here.

#if defined __INTEL_CODE_COVERAGE__ && defined __GLIBC__

// Specify that 2.6 is required because we know that 2.5 does NOT need this.
// The macro tests for >=. Will need to tune this if other glibc versions are in use.
// We have RHEL5 using 2.5, RHEL6 using 2.12.

#if __GLIBC_PREREQ(2,6) 

namespace std {
    template int string::_S_compare(size_type, size_type);
}

#endif /* glibc version >= 2.6 */

#endif /* intel code coverage and using glibc */

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////