gpt4 book ai didi

android - 链接到共享库时防止函数从静态库中剥离?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:12 29 4
gpt4 key购买 nike

我有一个静态库 Foo,它被一个共享库 Bar 使用。 Bar 是我的 Android 应用程序加载的 native 共享库。 Foo 包含 JNI 函数,这些函数只能由 Java 代码调用,而不能由 Bar 中的任何 C++ 代码调用。因此,当构建共享库 (Bar) 时,这些 JNI 函数会从静态库 (Foo) 中剥离出来。我目前正在使用一种稍微有点老套的方法来防止这种情况发生。

那么,在这种情况下,有没有办法告诉编译器在链接时不要剥离 JNI(或任何)函数?

最佳答案

他们没有被剥夺,他们被忽视了。链接共享库时,链接器仅拉入具有实际使用的函数的目标文件。 (这就是定义静态库的方式。)

我相信将“--whole-archive”标志传递给链接器会导致它从静态库中提取所有目标文件。您可以使用“-Wl,-whole-archive”在 gcc 链接行上提供它。在指定你的库后,你需要在它后面加上“-Wl,-no-whole-archive”,否则 ld 将继续它遇到的任何其他静态库的行为,这可能不是你想要的行为。另请参阅 Linux 系统上的 ld(1) 手册页。

完成同样事情的另一种方法是输出单个大型 .o 文件而不是 .a 文件。

编辑:简单的命令行示例,在桌面上使用 libz:

% echo "int main() { return 0; }" > foo.c
% gcc -o foo /usr/lib/libz.a foo.c
% ls -s foo
12 foo*
% gcc -o foo -Wl,-whole-archive /usr/lib/libz.a -Wl,-no-whole-archive foo.c
% ls -s foo
104 foo*

(这里必须使用“/usr/lib/libz.a”而不是“-lz”,因为后者会找到共享库/usr/lib/libz.so。)

我没有经常使用 NDK,但看起来将标志添加到 LOCAL_LDFLAGS 可能会有所帮助。

关于android - 链接到共享库时防止函数从静态库中剥离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3549432/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com