首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >预生成静态库失败

预生成静态库失败
EN

Stack Overflow用户
提问于 2013-05-17 13:22:26
回答 2查看 1.2K关注 0票数 3

我尝试建立一个基于CMake脚本的Android NDK构建,它动态地创建所需的Android make文件。虽然我不能使用JNI文件夹结构,但我将构建过程分成了几个独立的make脚本:

第一个创建位于项目根目录中的根Android.mk文件:

代码语言:javascript
运行
复制
#ANDROID ROOT MAKEFILE

LOCAL_PATH := D:/binrev/repository/bar
include $(CLEAR_VARS)

MY_LOCAL_CFLAGS := -DDEBUG
include D:/binrev/repository/bar/src/Android.mk

2.在项目源文件夹中创建源Android.mk文件,并进行模块构建:

代码语言:javascript
运行
复制
$(info "[INFO] Source Makefile invoked")

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

LOCAL_MODULE    := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_SRC_FILES :=  bar.cpp

ifeq (debug,"debug")
   MY_LOCAL_CFLAGS := -DDEBUG
endif

ifeq (false,true)
   LOCAL_ARM_MODE := arm
endif

LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid

LOCAL_STATIC_LIBRARIES += foo 

ifeq (OFF, ON)
   include $(BUILD_SHARED_LIBRARY)
else
   include $(BUILD_STATIC_LIBRARY)
endif

基本上,这种机制是有效的,我可以编译我的源代码,但如果我试图包含一个库的预构建,我就会失败。我尝试了以下方法来包含静态库的预构建(具有修改的源代码/包含定义):

代码语言:javascript
运行
复制
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := lib/android/$(TARGET_ARCH_ABI)/libfoo.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY) 

源Android.mk文件中的第一个预构建定义,第二个调用导入模块机制,并将预构建Android.mk文件添加到根Android.mk文件中的预构建库第三个预构建定义中

编辑:下面是调用导入测试的片段,也失败了:$(info "INFO Source Makefile invoked")

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

LOCAL_MODULE    := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_SRC_FILES :=  bar.cpp

ifeq (debug,"debug")
    MY_LOCAL_CFLAGS := -DDEBUG
endif

ifeq (false,true)
    LOCAL_ARM_MODE := arm
endif

LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid

LOCAL_STATIC_LIBRARIES += foo 

ifeq (ON, ON)
   include $(BUILD_SHARED_LIBRARY)
else
   include $(BUILD_STATIC_LIBRARY)
endif

$(call import-module, external-deps/foo)

在每种情况下,都会调用带有预构建定义的脚本,但不会执行预构建。当我的NDK构建完成后,预构建库和对象不会复制到我的obj文件夹。在我看来,预构建被完全忽略了。但是预构造源的路径是正确的,否则编译会失败并出现文件丢失错误。

您可以在这里获得此测试实现的完整源代码: test projectshttps://sourceforge.net/projects/binrevengine/files/publications/

提示: bar项目是试图预先构建foo项目的项目。foo项目包含预构建源代码。

添加的测试项目可以使用与CMake握手的MinGW64和预先安装的NDK (使用r8e)来构建。

我完全迷失了方向,没有了点子……谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-05-18 04:59:40

Android构建系统不会构建静态库,除非它被共享库使用。只需创建一个将静态库作为依赖项的虚拟共享库,就可以了:

代码语言:javascript
运行
复制
include $(CLEAR_VARS)
LOCAL_MODULE := dummy
LOCAL_PATH := $(LOCAL_PATH)
LOCAL_SRC_FILES := dummy.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
票数 0
EN

Stack Overflow用户

发布于 2013-05-22 17:07:26

为了排除可能的缺陷来源,我将Android make文件简化为最简单的情况,不使用这些文件的CMake生成器:

代码语言:javascript
运行
复制
LOCAL_PATH := D:/binrev/repository/bar
include $(CLEAR_VARS)

LOCAL_MODULE    := foo-prebuilt
LOCAL_SRC_FILES := external-deps/foo/lib/android/$(TARGET_ARCH_ABI)/libfoo.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)           
LOCAL_MODULE    := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_C_INCLUDES+= D:/binrev/repository/bar/external-deps/foo/include
LOCAL_SRC_FILES := src/bar.cpp


LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -landroid 

LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)

和:

代码语言:javascript
运行
复制
LOCAL_PATH := D:/binrev/repository/foo

include $(CLEAR_VARS)

LOCAL_MODULE    := foo
LOCAL_C_INCLUDES:= D:/binrev/repository/foo/include
LOCAL_SRC_FILES := src/foo.cpp

LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -landroid 

include $(BUILD_STATIC_LIBRARY)

故障仍然存在。不执行foo库的预编译。我也排除了MinGW64作为缺陷的可能来源,如果我试图用Windows命令行构建项目,它会导致同样的问题。共享库已生成,但未执行预生成。

我检查了我的源代码和脚本多次,但没有发现任何失败。有什么想法可能是错误的或遗漏的?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16601952

复制
相关文章

相似问题

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