我有一个我想要介绍的程序。但是,它有一些使用属性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头文件中,所以如果可能的话,我宁愿不改变函数声明。
答案 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给出,而不是使用通用字符名称