我根据下面的说明为安卓系统构建了卡萨布兰卡:如何在Linux上构建和安装Android (2.3+)。
我将编译好的库移到我的Android项目中,并将依赖于卡萨布兰卡的模块链接到这里的说明:如何在Android上使用C++ REST (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-64VM上,我的Android项目是在Windows64机器上构建的。然而,当我试图在Linux上为Android构建一个casablanca共享库时,我也遇到了多个链接器错误。
我怀疑有一些代码是用libstdc++编译的,有些是用libc++编译的。通过查看构建脚本,我可以看到clang被用于boost和casablanca,但我也看到指向gcc头部的路径。我也很好奇,为什么我在链接器输出(在Windows上)上看到/source/cxx-stl/gnu-libstdc++/4.8/include/与我的Linux路径有关。
任何关于如何让卡萨布兰卡在Android上正确链接的见解都将受到赞赏。
谢谢。
(我在这里上发布了同样的问题。)
发布于 2014-12-10 06:02:46
实际上,最后用libstdc++ (gnustl_shared)编译了项目代码。
发布于 2014-12-04 16:08:55
事实证明,卡萨布兰卡需要与libstdc++联系起来,但我在该项目中使用了clang。
因此,我做了以下修改,将我的项目模块链接到卡萨布兰卡。
我在Application.mk.中将APP_STL从c++_static改为c++_shared
此外,在具有依赖项模块的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)此外,我还为依赖于卡萨布兰卡的模块(因为它依赖于系统日志库)向Android.mk添加了以下内容:
LOCAL_LDLIBS := -lloghttps://stackoverflow.com/questions/27274844
复制相似问题