Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
__android中的属性(构造函数)_Android_C_Gcc_Constructor_Android Ndk - Fatal编程技术网

__android中的属性(构造函数)

__android中的属性(构造函数),android,c,gcc,constructor,android-ndk,Android,C,Gcc,Constructor,Android Ndk,我正在尝试开发android NDK。 实际上,我有一个包含模块(编译为静态库)的project+子文件夹,并与主项目文件(libs.a+main object.o-->可执行文件)链接在一起。一切都是通过ndk构建完成的 我试图利用构造函数,在挖掘了几个小时后,我发现只要不调用lib(.o)的函数,就不会调用构造函数 e、 g 仅当(和之前)my_init()时调用

我正在尝试开发android NDK。 实际上,我有一个包含模块(编译为静态库)的project+子文件夹,并与主项目文件(libs.a+main object.o-->可执行文件)链接在一起。一切都是通过ndk构建完成的

我试图利用构造函数,在挖掘了几个小时后,我发现只要不调用lib(.o)的函数,就不会调用构造函数

e、 g

仅当(和之前)
my_init()时调用test.c

$ adb shell /data/local/tmp/test
pre_func2
tutto funge!
现在,我的问题很简单。根据架构,我需要一些我准备好在加载对象时初始化的模块。。。我搜索了一些东西
(-init,_init())
没有一个有用

由于标准
linux(glibc和无仿生链接器)
上的相同代码看起来工作正常,因此我的编译gcc语句中是否存在避免在加载时执行构造函数的错误?我怎样才能解决这个问题

编译拇指:

modules <= libtest.c
    /opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-        linux-androideabi-gcc -MMD -MP -MF ./obj/local/armeabi/objs/modules/libtest.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/modules -DANDROID -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -Wa,--noexecstack  -I/opt/android-ndk-r8e/platforms/android-3/arch-arm/usr/include -c  jni/modules/libtest.c -o ./obj/local/armeabi/objs/modules/libtest.o 
    StaticLibrary  : libmodules.a
    rm -f obj/local/armeabi/libmodules.a
    /opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crs ./obj/local/armeabi/libmodules.a ./obj/local/armeabi/objs/modules/libtest.o ./obj/local/armeabi/objs/modules/module.o

modules我想问题在于,如果没有从test.c调用某些
.o
,它就没有链接到test可执行文件中。这就是liner处理静态库(
.a
文件)的方式。要强制所有编译单元(也称为
.o
文件)出现在可执行文件中,请使用

-Wl,-whole-archive libmodules.a -Wl,-no-whole-archive
用于建筑。您可以在NDK中通过指定

LOCAL_WHOLE_STATIC_LIBRARIES := modules
但我必须承认,我从未用
$(BUILD\u EXECUTABLE)
尝试过这一点。它适用于
$(构建共享库)
。如果有什么地方出了问题,就写下来

LOCAL_LDFLAGS := -Wl,-whole-archive $(PATH_TO_LIBMODULES)/libmodules.a -Wl,-no-whole-archive

不要忘了正确设置
PATH\u to_LIBMODULES

首先检查
objdump-t
的输出,查看即使主可执行文件没有调用库中的函数,库中的符号是否仍然链接。默认情况下,NDK将使用
--gc sections
。我怀疑这将丢弃包含构造函数的部分。
LOCAL_LDFLAGS := -Wl,-whole-archive $(PATH_TO_LIBMODULES)/libmodules.a -Wl,-no-whole-archive