C++防止链接器丢弃函数



我正在为android构建一个C++库。我有一个X.so共享库,它最终在安卓应用程序中,可以通过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

如果有任何clang属性或技巧可以迫使链接器不丢弃我需要的特定函数(当我构建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

最新更新