我正在将一些东西移植到 Android,并且我有几个应该链接到 .so 文件中的静态库(使用 Android NDK)。我尝试使用-Wl,-whole-archive
到链接器(并由适当的终止-Wl,-no-whole-archive
)但出现错误,例如:
c:/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe : error : C:/Users/Brent/Documents/git/gamelib/Core/Android/Android/Debug/Core-Android.a:
member at 25678 is not an ELF object [C:\Users\Brent\Documents\git\blackjack\blackjack-android.vcxproj]
还有许多对尚未实现的函数的未定义引用,但被已实现但未使用的其他函数调用(通常会被删除)。全部内容尚未移植,但因此我无法使用 -whole-archive 测试(甚至构建)现有代码。需要更细粒度的东西。
所以,我决定尝试使用__attribute__((used))
在我的静态库中声明函数时:
extern "C" {
void Java_com_brainium_blackjack_BlackjackJNILib_step(JNIEnv* _jni_env, jobject jthis) __attribute__ ((visibility ("default"))) __attribute__ ((used));
};
void Java_com_brainium_blackjack_BlackjackJNILib_step(JNIEnv* _jni_env, jobject jthis) {
}
但它仍然被剥夺。将此代码放入直接编译到 .so 的 .cpps 之一中可以正常工作,但如果我将其放入静态库并将该库链接到 so 中,则它不起作用。我已经使用 nm 来确保它实际上被排除,并且静态库的其他符号(正在引用)存在(因此链接通常正常工作)。是__attribute__((used))
没有按预期工作,或者我只是使用错误?谢谢。
旁注:我没有使用 ndk-build (或 make 文件)来构建这个项目。我正在使用(并扩展)vs-android。
Edit:经过一番搜索,似乎__attribute__((used))
不执行任何操作,因为 .o 文件如果链接器没有看到引用,则甚至不会检查。 https://stackoverflow.com/a/3559733/395029这也向我表明,如果我只是通过其他方式强制它读取所有 .o 文件(将 .o 文件合并为一个 .o 文件,或使用 -u 选项),它仍然会具有相同的效果作为--整个存档。看来得到--whole-archive
工作可能是唯一的解决办法。