我正在使用 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?或者库如何复制到更改权限的工作目录中?