Android-NDK:如何使用未定义的引用构建动态库,该引用将在运行时链接

时间:2019-08-01 14:40:10

标签: cmake android-ndk

我正在尝试构建一个动态库,该库应包含一些未定义的引用(基本上调用属于其他动态库的某些函数,并且在加载该库之前将先加载它们)。但是使用下面的任何或所有标志,我得到一个错误“错误:未定义对“ test_func”的引用”。 “ test_func”是将从native-lib.so调用的函数,但可以由b.so或c.so公开。我希望从库中调用函数test_func(),该库将在运行时(b.so或c.so)以dlopen()加载,以便我可以加载暴露test_func()方法的不同库。我的应用程序的不同调用。谁能告诉我要在我的CMakeLists.txt文件中设置正确的标志,或者如果不能在Android-Ndk中实现的话,请告诉我。这类似于Linux所允许的,所以我想我缺少了一些东西。

尝试了以下CMakeLists.txt中的标志设置

cmake_minimum_required(VERSION 3.4.1)
set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl, --allow-shlib-undefined" )
set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl, -undefined" )

set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
set(LOCAL_ALLOW_UNDEFINED_SYMBOLS true)

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

native-lib.cpp:

extern void undefined_func();
void main() {
    undefined_func();
}

预先感谢:)

编辑: 使用CMake进行详细日志记录时,build.ninja文件中的标志如下。

  

LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -fno-addrsig -Wa,-noexecstack -Wformat -Werror =格式安全性-stdlib = libc ++ -std = c ++ 11 -frtti -fexceptions -O0 -fno-limit-debug-info
  LINK_FLAGS = -Wl,-exclude-libs,libgcc.a -Wl,-exclude-libs,libatomic.a -static-libstdc ++ -Wl,-build-id -Wl,-warn-shared-textrel -Wl ,-致命警告 -Wl,-未定义-带引数的参数-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在-Wl,- allow-shlib-undefined -Wl,-undefined

我认为 -Wl,-no-undefined 选项引起了错误。关于如何禁用此链接器标志的任何想法。

0 个答案:

没有答案