【问题标题】:Casablanca Linker Errors on AndroidAndroid 上的卡萨布兰卡链接器错误
【发布时间】:2014-12-03 14:58:04
【问题描述】:

我按照此处的说明为 Android 构建了 casablanca:How to build and setup for Android on Linux (2.3+)

我将已编译的库移至我的 Android 项目,并按照此处的说明链接了依赖于 casablanca 的模块: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 虚拟机上构建,我的 Android 项目在 Windows-64 机器上。但是,在尝试在 Linux 上为 Android 构建 casablanca 共享库时,我也遇到了多个链接器错误。

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

任何关于如何让 casablanca 在 Android 上正确链接的见解将不胜感激。

谢谢。

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

【问题讨论】:

  • 我摆脱了链接器错误...我会尽快发布解决方案...

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


【解决方案1】:

事实证明 casablanca 需要与 libstdc++ 链接,但我在项目中使用 clang

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

我将 APP_STLc++_static 更改为 c++_sharedApplication.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)

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

LOCAL_LDLIBS    := -llog

【讨论】:

    【解决方案2】:

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

    【讨论】: