在为Android开发JNI库时,我偶然发现了一个问题,我可以使用NDK r19b和以下MWE的clang来重现该问题:
void firstFunctionSymbol() {}
template <class Y>
class T {
public:
T(Y){};
};
T<int> test() {
return {1};
}
int main(){
return 0;
}
使用以下方法进行编译和检查时:
$ android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/\
armv7a-linux-androideabi26-clang++ -g -c main.cpp -o main.o
$ android-ndk-r19b/toolchains/arm-linux-androideabi-4.9/prebuilt/\
linux-x86_64/arm-linux-androideabi/bin/objdump -DS main.o --demangle
我得到以下输出:
00000000 <firstFunctionSymbol()>:
void firstFunctionSymbol() {}
0: e12fff1e bx lr
00000004 <test()>:
class T {
public:
T(Y){};
};
T<int> test() {
4: e92d4800 push {fp, lr}
8: e1a0b00d mov fp, sp
c: e24dd008 sub sp, sp, #8
return {1};
10: e28d0004 add r0, sp, #4
14: e3001001 movw r1, #1
18: ebfffffe bl 0 <firstFunctionSymbol()>
1c: e58d0000 str r0, [sp]
20: e1a0d00b mov sp, fp
24: e8bd8800 pop {fp, pc}
请注意第18行如何引用firstFunctionSymbol而不是预期的T<int>(int)
。
我做错什么了吗?还是叮当声使我失望?
请注意:
T(Y){}
是应内联的函数时,才会出现此问题。例如。通过在函数前定义extern template class T<int>;
,符号指向正确的点。