【问题标题】:__attribute__((used)) has no effect when linking static library into shared object (android gcc 4.8)__attribute__((used)) 将静态库链接到共享对象时无效(android gcc 4.8)
【发布时间】:2013-09-14 21:43:22
【问题描述】:

我正在将一些东西移植到 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(或制作文件)来构建这个项目。我正在使用(和扩展)vs-android。

编辑: 经过一番搜索,__attribute__((used)) 似乎没有做任何事情,因为 .o 文件 aren't even examined if the linker doesn't see a reference. 这也向我表明,如果我只是强迫它阅读通过其他方式(将 .o 文件组合成一个 .o 文件,或使用 -u 选项)所有 .o 文件,它仍然具有与 --whole-archive 相同的效果。似乎让--whole-archive 工作可能是唯一的解决方案。

【问题讨论】:

    标签: android c++ gcc android-ndk java-native-interface


    【解决方案1】:

    如果您使用的是 NDK make 文件,您可以在链接到主机库或可执行文件时尝试使用 LOCAL_WHOLE_STATIC_LIBRARIES 而不是 LOCAL_STATIC_LIBRARIES。这将避免从静态库中剥离任何内容。

    虽然它没有太多的粒度...

    【讨论】:

    • 这都是通过 vs-android (所以没有 .mk 文件)。不过我最终还是放弃了,我回到了 Eclipse,LOCAL_WHOLE_STATIC_LIBRARIES 工作正常。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2014-02-18
    • 2011-08-02
    相关资源
    最近更新 更多