ndk编译的可执行程序调用动态库的路径的问题,帮忙看下

时间:2021-01-09 17:23:58
我用ndk编译一个纯c的程序,编译后生成一个可执行程序,需要调用动态库,比如动态库的名字叫libtest.so

然后c文件叫main.c

然后makefile是这样写的

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
    main.c
LOCAL_LDLIBS := -ltest
    
LOCAL_LDFLAGS += -L./
#LOCAL_LDLIBS += -Wl 
#LOCAL_LDLIBS += -rpath./
LOCAL_PRELINK_MODULE := true
LOCAL_MODULE:= main
include $(BUILD_EXECUTABLE)

然后编译出来的main和test库一起push到/mnt/asec,然后进adb shell进入到/mnt/asec目录下chmod 777 main
然后执行./main 说库无法链接,然后将test库复制到/system/lib下面,就可以顺利执行了

在编译的时候如果LOCAL_LDFLAGS += -L./不加的话是无法编译的,编译的时候库和main.c已经一系列头文件在一个目录下,加了LOCAL_LDFLAGS += -L./
就可以编译过了,但是加载的时候放在一个目录下不能加载,那请问有什么办法可以直接把可执行程序和动态库放在一起,而不用把动态库放到/system/lib下面就可以调了?

4 个解决方案

#1


有人知道吗?

#2


android动态库一定要放在 system/lib下才可以。
如果不想这么做,自己用dlopen来看行不行。不过这样就太麻烦了。

#3


引用 2 楼 freshui 的回复:
android动态库一定要放在 system/lib下才可以。
如果不想这么做,自己用dlopen来看行不行。不过这样就太麻烦了。


dlopen是ok的,不过很奇怪的是,dlopen的路径必须要写绝对路径,这点我没搞清楚
我把一个so库放在可执行文件的同级目录然后dlopen(./xxx.so)就出错,但是路径是绝对路径就没有问题
于是我想是不是在执行的时候索引的其实路径并不是从可执行程序的当前路径开始,于是我尝试mkdir(./xxx)创建一个文件夹,但是没想到就在当前目录下创建了一个文件夹,这就很奇怪了,我想也许dlopen需要先调用libdl这个库,可能是这个库里面去open一个自定义库,也许是libdl所在库作为起始路径,还未曾尝试验证

#4


引用 2 楼 freshui 的回复:
android动态库一定要放在 system/lib下才可以。
如果不想这么做,自己用dlopen来看行不行。不过这样就太麻烦了。


刚刚尝试了,果然是libdl所在的路径作为起始路径,把库放在libdl.so所在的文件夹下,dlopen(./xxx.so)就能打开了,我猜的没错

#1


有人知道吗?

#2


android动态库一定要放在 system/lib下才可以。
如果不想这么做,自己用dlopen来看行不行。不过这样就太麻烦了。

#3


引用 2 楼 freshui 的回复:
android动态库一定要放在 system/lib下才可以。
如果不想这么做,自己用dlopen来看行不行。不过这样就太麻烦了。


dlopen是ok的,不过很奇怪的是,dlopen的路径必须要写绝对路径,这点我没搞清楚
我把一个so库放在可执行文件的同级目录然后dlopen(./xxx.so)就出错,但是路径是绝对路径就没有问题
于是我想是不是在执行的时候索引的其实路径并不是从可执行程序的当前路径开始,于是我尝试mkdir(./xxx)创建一个文件夹,但是没想到就在当前目录下创建了一个文件夹,这就很奇怪了,我想也许dlopen需要先调用libdl这个库,可能是这个库里面去open一个自定义库,也许是libdl所在库作为起始路径,还未曾尝试验证

#4


引用 2 楼 freshui 的回复:
android动态库一定要放在 system/lib下才可以。
如果不想这么做,自己用dlopen来看行不行。不过这样就太麻烦了。


刚刚尝试了,果然是libdl所在的路径作为起始路径,把库放在libdl.so所在的文件夹下,dlopen(./xxx.so)就能打开了,我猜的没错