我尝试在 GNU 的链接器包装选项的帮助下包装模板函数。代码如下所示:
// f.h
template<typename T>
void f(T t) {
}
// bar.h
void bar();
// bar.cpp
#include "bar.h"
#include "f.h"
void bar() {
f(42);
}
// test.cpp
extern "C" {
extern void __real__Z1fIiEvT_(int i);
void __wrap__Z1fIiEvT_(int i) {
__real__Z1fIiEvT_(i);
}
}
int main() {
bar();
}
上面显示的代码与以下命令链接:
g++ -Xlinker -wrap=_Z1fIiEvT_ -o test test.o bar.o
不幸的是,这不起作用,并且总是调用原始函数f而不是我的包装版本__wrap__Z1fIiEvT_。你看到我犯了什么错误吗?
编辑:按照建议,我在此处附加了nm的输出,以确保我没有对模板函数的损坏名称犯任何错误:
$ g++ -c bar.cpp -o bar.o
$ nm bar.o
0000000000000000 W _Z1fIiEvT_