Android上的卡萨布兰卡链接器错误

时间:2014-12-03 14:58:04

标签: android c++ android-ndk linker casablanca

我根据以下说明为Android构建了卡萨布兰卡:How to build and setup for Android on Linux (2.3+)

我将已编译的库移动到我的Android项目,并按照以下说明链接依赖于卡萨布兰卡的模块:How to use the C++ REST SDK on Android (2.3+)

但是,我收到多个链接器错误。

例如,在尝试使用时

json::value::string( "some value" );

我明白了,

error: undefined reference to 'web::json::value::string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)'

尝试使用时

json::value version;
version[someValue] = something;

我明白了,

error: undefined reference to 'web::json::value::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)'

我正在用clang编译我的Android项目。

我在Linux-64 VM上构建,我的Android项目在Windows-64计算机上。但是,当尝试在Linux上为Android建立一个casablanca共享库时,我也遇到了多个链接器错误。

我怀疑有些代码是用libstdc ++编译的,有些是用libc ++编译的。从查看构建脚本,我可以看到clang用于boost和casablanca,但我也看到包含指向gcc头的路径。我也很好奇为什么我在链接器输出(在Windows上)上看到对我的Linux VM路径的/sources/cxx-stl/gnu-libstdc++/4.8/include/的引用。

有关如何让卡萨布兰卡在Android上正确链接的任何见解将不胜感激。

感谢。

(我发布了同样的问题here。)

2 个答案:

答案 0 :(得分:0)

事实证明 casablanca 需要与 libstdc ++ 相关联,但我正在为项目使用 clang

所以我做了以下更改,将我的项目模块链接到 casablanca

我将 APP_STL c ++ _ static 更改为 c ++ _ shared Application.mk 中。

此外,在我有依赖项模块的 Android.mk 文件中,我添加了以下内容:

#GNU STL 
#Note: this is the GNU STL static library used by casablanca
include $(CLEAR_VARS)
LOCAL_MODULE    :=  gnustl
LOCAL_SRC_FILES :=  ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/libs/$(TARGET_ARCH_ABI)/libgnustl_static.a
include $(PREBUILT_STATIC_LIBRARY)

#Casablance prebuilt
#Note: These are the includes that casablanca uses.
include $(CLEAR_VARS)
LOCAL_MODULE    :=  casablanca
LOCAL_SRC_FILES :=  $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/libcpprest.a
LOCAL_EXPORT_C_INCLUDES := ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include \
                           ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/libs/$(TARGET_ARCH_ABI)/include \
                           ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include/backward
LOCAL_WHOLE_STATIC_LIBRARIES := gnustl
include $(PREBUILT_STATIC_LIBRARY)

此外,我将以下内容添加到依赖于 casablanca 的模块的 Android.mk 中(因为它取决于系统日志记录库 >):

LOCAL_LDLIBS    := -llog

答案 1 :(得分:0)

实际上最终用libstdc ++(gnustl_shared)编译项目代码。