我正在使用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 /臂-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?或者是否存在将库复制到更改权限的工作目录中的方法?
答案 0 :(得分:0)
我们使用gnustl在cocos2d-x中有样本。
尝试将* .mk文件(包括Android.mk和Application.mk)基于它们: https://github.com/cocos2d/cocos2d-x/tree/master/samples/Cpp/HelloCpp/proj.android/jni
答案 1 :(得分: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_static
”的行(它在NDK中断开,在Linux Cygwin,Windows上略有不同)在 Android.mk 文件中的$(LOCAL_LDLIBS)
添加一行,说明“
$(NDK_ROOT)/源/ CXX-STL / GNU-的libstdc ++ / 4.6 /库/ 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
前言将完成你的 Application.mk 中的“APP_STL := gnustl_static
”。