请教个Android底层c的第三方静态库编译问题? 400 报错
请教个第三方静态库编译的问题。
sqlite 第三方源码,想编译到hellow.c项目中使用。
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_STATIC_LIBRARIES := mysqlite3 libc libcutils LOCAL_C_INCLUDES := $(LOCAL_PATH)/mysqlite3 LOCAL_SRC_FILES:= \ hellow.c \ dbaction.c LOCAL_MODULE:= hellow LOCAL_MODULE_TAGS := optional include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE := mysqlite3 LOCAL_SRC_FILES := mysqlite3/sqlite3.c LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION include $(BUILD_STATIC_LIBRARY)
此静态库编译好后是没问题的,然后我在mysqlite目录下添加一个codext.c用来实现sqlite3_key方法的加密,codext.c与sqlite3.c是在同一个目录。根据上面的编译内容来编译后,就出错了。错误是:error: undefined reference to 'sqlite3_key'。请问大家,要怎么处理?
把 context.c 也放到 LOCAL_SRC_FILES 中######LOCAL_SRC_FILES := mysqlite3/sqlite3.c mysqlite3/codecext.c 我这样加了,结果还是这个错误。 error: undefined reference to 'sqlite3_key'######
LOCAL_SRC_FILES := mysqlite3/sqlite3.c mysqlite3/codecext.c 我这样加了,结果还是这个错误。
error: undefined reference to 'sqlite3_key'
######那要查查这个函数 sqlite3_key 是否在这个文件中,或者这个函数有没有宏包围,或者前后调整一下位置。######看看一下######是不是没包含sqlite3的头文件?######包含关系正确了,是编译配置问题,因为我把sqlite3作为静态库配置到我的hellow里面,所以codecext.c内的方法sqlite3_key实现无法调用。现在我用include "codecext.c"的方式包含进来就可以了。可是问题又出来了。
undefined reference to 'dlopen'
undefined reference to 'dlsym'
undefined reference to 'dlclose'
undefined reference to 'dlerror'
我百度了一下说要加入LOCAL_LDLIBS := -ldl来编译。我添加了还是报这个错误。
目前我发现sqlite3如果要编译成静态库需要配置LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION。代码中,如果这个配置了是不会触发上面报错的区域的。
#ifndef SQLITE_OMIT_LOAD_EXTENSION /* ** Interfaces for opening a shared library, finding entry points ** within the shared library, and closing the shared library. */ #include <dlfcn.h> static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ UNUSED_PARAMETER(NotUsed); return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。