0

我正在使用 NDK 和 Boost 库以及作为 Cocos2d-x 游戏引擎一部分的库来开发一个 Android 项目。我认为我遇到的问题是链接库和使用 NDK 的简单问题,但为了完整性,我提到了 Boost 和 cocos2d-x。

当我使用 ndk-build 构建我的项目时,我的所有代码似乎都可以很好地编译为目标文件,这表明 g++ 可以找到我正在使用的所有库头。我相信,当链接开始时,G++ 会爆炸,因为它试图构建将我的代码和库绑定在一起的共享库。

可以在此处找到包含错误的构建日志:http: //txtup.co/tMtJ

出现的第一个错误,

C:/Android/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.7/../../.. /../arm-linux-androideabi/bin/ld.exe:错误:无法打开 ./obj/local/armeabi/libgnustl_static.a:权限被拒绝

似乎很有说服力,因为 libgnustl_static.a 应该包含所有函数的实现,例如 'std::string::operator+',g++ 说它在该错误之后找不到引用。

libgnustl_static.a 在构建期间被复制到 ./obj/local/armeabi 中,所以我知道我的 makefile 至少在某个时候知道该库。我猜想这发生在“权限被拒绝”错误之前,但我不能确定。

下面是我想成为所有这些编译的最终产品的 libgame.so 库的 android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

LOCAL_SRC_FILES += hellocpp/main.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
            $(LOCAL_PATH)/../../../cocos2dx/platform/third_party/android/prebuilt/libboost_serialization/include/ \
$(LOCAL_PATH)/../../../cocos2dx/platform/third_party/android/prebuilt/libboost_serialization/include/boost/archive \
$(LOCAL_PATH)/../../../cocos2dx/platform/third_party/android/prebuilt/libboost_serialization/include/boost/serialization                

LOCAL_WHOLE_STATIC_LIBRARIES := boost_1_53_serialization cocos2dx_static cocosdenshion_static cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,libboost_serialization) \
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions)

makefile 是否有某些原因无法找到或使用 libgnustl_static?或者库如何复制到更改权限的工作目录中?

4

2 回答 2

0

我们在 cocos2d-x 中有使用 gnustl 的示例。

尝试基于您的 *.mk 文件(Android.mk 和 Application.mk): https ://github.com/cocos2d/cocos2d-x/tree/master/samples/Cpp/HelloCpp/proj.android/jni

于 2013-03-15T21:18:00.607 回答
0

这是一个错误,gcc/NDK它在 Linux、Cygwin 和 Windows(非 Cygwin)上的表现略有不同。

如果您将运行ndk-build V=1并将其传输到日志文件(例如ndk-build V=1 &> logfile)。你会看到一堆你的对象正在编译,再往下一点你会看到它们被链接,然后是链接错误的“爆炸”——这些错误将与 libgnustl 有关。现在查看导致错误的命令。在 NDK r8d 之前,libgnustl_static 被复制$(NDK_ROOT)到您的 objs 目录并从那里链接,现在您应该看到它那里,但由于 gcc 原因我不会让您感到厌烦,它必须在(或接近)末尾。

这是我为修复它所做的...

  • APP_STL := gnustl_staticApplication.mk中删除“”行(它在 NDK 中损坏,在 Linux Cygwin、Windows 上的损坏略有不同)
  • $(LOCAL_LDLIBS)在您的Android.mk文件中添加一行内容:“

    $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a

    "

  • 还在Android.mk中添加两行代码,

    LOCAL_C_INCLUDES := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/include LOCAL_C_INCLUDES += $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include

上述将完成APP_STL := gnustl_static您的Application.mk中应该有的“”。

于 2013-05-20T14:55:37.060 回答