开发者社区> 问答> 正文

请教个Android底层c的第三方静态库编译问题? 400 报错

请教个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'。请问大家,要怎么处理?


展开
收起
爱吃鱼的程序员 2020-06-03 15:46:50 658 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    把 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);
    
    }



    但是我编译的是执行程序,不是静态库。是不是原本我的编译思路错了?应该先编译sqlite3为静态库,然后我的项目里调用这个静态库?

    2020-06-03 20:54:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载