首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android.mk、Android.mk和OCaml的通用链接

Android.mk、Android.mk和OCaml的通用链接
EN

Stack Overflow用户
提问于 2015-12-07 00:44:37
回答 2查看 456关注 0票数 2

我正在使用Android.mk工具包,并拥有这个Android.mk文件。

代码语言:javascript
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ocaml
LOCAL_SRC_FILES := ocaml/hello.so
include $(PREBUILT_SHARED_LIBRARY)

# ocamlfind -toolchain android ocamlopt \
# -output-complete-obj -cclib -shared hello.ml -o hello.so

include $(CLEAR_VARS)
LOCAL_MODULE := simple_test
LOCAL_SRC_FILES := main.c
# This name had to be that created shared library
LOCAL_STATIC_LIBRARIES := ocaml
LOCAL_C_INCLUDES += /home/gar/.opam/android_coding/lib/ocaml

include $(BUILD_EXECUTABLE)

这将成功编译并在/home/gar/ocaml_on_android/libs/armeabi、simple_test和hello.so中创建。

然而,当我在我的Nexus 7上运行代码时,我得到

CANNOT LINK EXECUTABLE: library "/home/gar/ocaml_on_android/obj/local/armeabi/hello.so" not found

这意味着它在编译时没有正确地链接。我如何编写这个Android.mk文件,以便在一个可执行文件中静态地编译所有内容?

编辑:注释之后,使用以下内容:

代码语言:javascript
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ocaml
LOCAL_SRC_FILES := ocaml/hello.so
include $(PREBUILT_SHARED_LIBRARY)

# ocamlfind -toolchain android ocamlopt \
# -output-complete-obj -cclib -shared hello.ml -o hello.so

include $(CLEAR_VARS)
LOCAL_MODULE := simple_test
LOCAL_SRC_FILES := wrapper.c
# This name had to be that created shared library
LOCAL_SHARED_LIBRARIES := hello.so
LOCAL_C_INCLUDES += /home/gar/.opam/android_coding/lib/ocaml

include $(BUILD_EXECUTABLE)

在项目的libs文件夹中,我仍然有两个对象,hello.so和simple_test exectuable,我希望只看到一个对象。对于LOCAL_SHARED_LIBRARIES,不确定是否需要将模块名、ocaml或实际的共享对象hello.so。无论是哪种情况,仍然会在libs目录中生成两个对象。

EDIT2:我现在为我的Android.mk准备了这个

代码语言:javascript
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ocaml
LOCAL_SRC_FILES := ocaml/hello.so
include $(PREBUILT_SHARED_LIBRARY)

# ocamlfind -toolchain android ocamlopt \
# -output-complete-obj -cclib -shared hello.ml -o hello.so

include $(CLEAR_VARS)
LOCAL_MODULE := simple_test
LOCAL_SRC_FILES := wrapper.c
# This name had to be that created shared library
LOCAL_CFLAGS := -Wl,-Bstatic -static
LOCAL_SHARED_LIBRARIES := hello ocaml
LOCAL_C_INCLUDES += /home/gar/.opam/android_coding/lib/ocaml

include $(BUILD_EXECUTABLE)

当我检查创建的可执行文件时,我仍然看到它取决于共享库。

代码语言:javascript
复制
arm-linux-androideabi-readelf -d simple_test | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [/home/gar/asm_on_android/obj/local/armeabi/hello.so]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]

我还在设备上的shell上尝试了LD_LIBRARY_PATH=. ./simple_test命令,但得到了以下错误:

代码语言:javascript
复制
 LD_LIBRARY_PATH= . ./simple_test                                                                 
sh: ./simple_test[1]: syntax error: '\
                                       4' unexpected
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-08 16:43:18

感谢亚历克斯的帮助。

我决定暂时跳过Android,而只是选择了一个直接的Makefile解决方案,这是可行的。

这是Makefile

代码语言:javascript
复制
cc := arm-linux-androideabi-gcc

sys_root := /Users/Edgar/.opam/4.02.3+32bit/lib/android-ndk/platforms/android-21/arch-arm

includes := /Users/Edgar/.opam/4.02.3+32bit/arm-linux-androideabi/include

ml_includes := /Users/Edgar/.opam/4.02.3+32bit/arm-linux-androideabi/lib/ocaml/

libs := /Users/Edgar/.opam/4.02.3+32bit/arm-linux-androideabi/lib

# Be sure to do export LD_LIBRARY_PATH=. and then run the program.
# Not sure how to do static linking yet, this will only dynamically
# link the program
complete: lib
    $(cc) --sysroot $(sys_root) -I$(includes) -L$(libs) \
    -pie -I$(ml_includes) hello.so main.c -o Finished

lib:
    ocamlfind -toolchain android ocamlopt -output-complete-obj \
    -cclib '-lm -shared' hello.ml -o hello.so

# This is a pure OCaml exectuable
exec:
    ocamlfind -toolchain android ocamlopt \
    -verbose -ccopt '-fPIE' -cclib '-pie' hello.ml -o hello

.PHONY: clean
clean:
    @rm -rf *.{cmi,cmt,o,cmx,so} Finished

...Substitute您的名字和路径,酌情。还把回购放在这里,android

票数 0
EN

Stack Overflow用户

发布于 2015-12-07 19:30:49

共享库就是这样使用的。您可以在hello.so可执行文件附近将simple_test推送到设备上。

Android.mk的语法应该是

代码语言:javascript
复制
LOCAL_SHARED_LIBRARIES := ocaml

在shell命令行上,使用

代码语言:javascript
复制
LD_LIBRARY_PATH=. ./simple_test
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34124770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档