使用mingw 4.8强制单独复制gnu_inline函数

时间:2014-01-03 20:42:39

标签: c++ qt mingw

我有一个我想要介绍的程序。但是,它有一些使用属性gnu_inline声明的函数。如果我尝试使用-finstrument-functions标志构建程序,我会收到链接器错误,例如:

#define always_inline __attribute__((always_inline, gnu_inline))
static int inline always_inline f()
{
    return 0;
}

int main(int argc, char *argv[])
{
    int i = f();

    return i;
}

给了我“对f()的未定义引用”错误。 问题是编译器试图将f()的地址传递给分析函数,但函数是内联的,所以没有函数体,也没有f()的地址。

我尝试使用-fkeep-inline-functions标志构建我的程序,但它显然对使用gnu_inline声明的函数没有影响。

是否有可能以某种方式迫使编译器为链接器制作单独的f()副本?或者这些功能无法发展?

我的程序使用Qt 5,这些函数位于Qt头文件中,所以如果可能的话,我宁愿不改变函数声明。

1 个答案:

答案 0 :(得分:0)

至少,以下两个选项可以使您的场景工作,即使可能有更漂亮的解决方案:

  

-finstrument函数 - 排除文件列表=文件,文件,...

     

设置从检测中排除的函数列表(请参阅“-finstrument-functions”的说明)。如果包含函数定义的文件与一个匹配              的文件,然后该功能没有检测。匹配在子字符串上完成:如果file参数是文件名的子字符串,则认为它是匹配的。

       For example:

               -finstrument-functions-exclude-file-list=/bits/stl,include/sys

       excludes any inline function defined in files whose pathnames contain "/bits/stl" or "include/sys".

       If, for some reason, you want to include letter ',' in one of sym, write ','. For example, "-finstrument-functions-exclude-file-list=',,tmp'" (note the single quote surrounding the
       option).
  

-finstrument函数 - 排除功能列表=符号,符号,...

     

这类似于“-finstrument-functions-exclude-file-list”,但此选项设置要从检测中排除的函数名列表。要匹配的函数名称是其用户可见的名称,例如“vector blah(const vector&)”,而不是内部损坏的名称(例如,“_ Z4blahRSt6vectorIiSaIiEE”)。匹配在子字符串上完成:如果sym参数是函数名称的子字符串,则认为它是匹配的。对于C99和C ++扩展标识符,函数名必须以UTF-8给出,而不是使用通用字符名称