如何解决C ++防止链接器丢弃函数
我正在为Android构建C ++库。我有X.so共享库,它最终出现在android应用程序中,并且可以通过JNI访问。我还拥有一个Y.a静态库,该库几乎没有X.so使用的通用函数。 Y.a还具有一些JNI接口功能,并且应由android应用程序访问。 目前,我遇到的问题是,在构建Y.a之后,我可以看到需要导出的所有符号。但是在将其链接到X.so之后,链接器会丢弃所有JNI接口函数,因为它们未在内部使用。我没有运气就尝试了以下2种选择,
1。
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL myImportantFunction(JNIEnv*,jclass);
.
.
.
void* volatile tmp = (void*)&myImportantFunction;
#ifdef __cplusplus
}
#endif
2。
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void __attribute__((used)) JNICALL myImportantFunction(JNIEnv*,jclass);
.
.
.
#ifdef __cplusplus
}
#endif
如果有任何叮当声属性或hack可以迫使链接器不放弃我需要的特定功能(当我构建Y.a时),那将是理想的选择。谢谢大家在这方面的帮助。
解决方法
如果您想保留整个 Y.a
,那么-Wl,--whole-archive -lY -Wl,--no-whole-archive
确实是可行的方法。
如果您只想保留Y.a
中的特定符号,但要让链接程序从其中丢弃其他(未使用的)目标文件,则需要告诉链接程序这些功能已被使用,就像这样:>
g++ -u myImportantFunction x1.o x2.o ... -lY -shared -o X.so
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。