【问题标题】:ndk-build undefined reference errrorndk-build 未定义的引用错误
【发布时间】:2018-05-03 12:30:18
【问题描述】:

我正在使用 ndk-build 为我的 android 项目构建一组共享库 (.so)。我配置并制作了 C++ 库的源代码(gdal-2.2.2)。 一切正常。(“./configure & make & make install”成功)。

所以我像这样documentation 创建了我的 jni 文件夹。

但是当我尝试在 Windows 上使用 ndk-build 时,我收到很多错误,例如“未定义对某物的引用”。

我在这个项目上花了很多时间。有人帮我吗? 谢谢。

更新

我在 ubuntu 16.04 上使用了这样的配置:

./configure --prefix=/home/mahdi/Desktop/build/ --with-spatialite=yes --with-spatialite-soname=libspatialite.so --host=i686-linux-android  CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" LIBS="-lsupc++ -lstdc++"

make & make install 步骤之后,我创建了 JNI。这是我的目录。

jniwrap
jni
  gdal
  Android.mk
  Application.mk
  gdal_wrap.cpp
  gdalconst_wrap.c  
  gnm_wrap.cpp  
  libgdal.a 
  ogr_wrap.cpp
  osr_wrap.cpp

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdaljni
LOCAL_SRC_FILES := gdal_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdalconstjni
LOCAL_SRC_FILES := gdalconst_wrap.c
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ogrjni
LOCAL_SRC_FILES := ogr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := osrjni
LOCAL_SRC_FILES := osr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

应用程序.mk

APP_STL := gnustl_shared
APP_CFLAGS := Android.mk
APP_ABI := x86
APP_PLATFORM := android-14

然后我在 windows-x86_64 中使用了 android-ndk-r16b,但我遇到了如下图所示的错误:

有很多“未定义的引用错误”我无法在此处显示。

注意:为了制作 gdal Java Binding,我在 ubuntu 16.04 上使用了 swig 和 jdk7。

【问题讨论】:

  • 请提供一个最小示例以及生成的错误消息。
  • 请注意,此项目使用 NDK r7。很可能,这些指令与现代 NDK (r16) 不再相关。有时,安装较旧的 NDK(例如来自developer.android.com/ndk/downloads/older_releases 的 r10)会有所帮助。否则,请提供更多信息:哪些未定义的引用,哪些步骤成功完成等。公开./configure的所有参数——这里很容易出错。
  • @AlexCohn 请阅读给定的更新。
  • 关于您的设置的一个有趣事实是,解释如何为 Android (github.com/nutiteq/gdal) 构建库的 gdal fork 不包含导致未定义引用 sqlite3_bind_…ogrsqliteapiroutines.c 文件职能。有没有可能将不同的版本混合在一起?为什么不在同一台 ubuntu 机器上运行 ndk 步骤?迁移到 Windows 是设置中的另一个麻烦点。如果您更喜欢在该平台上使用 Android Studio,则将生成的 JNI 库复制到 Windows 会更安全。

标签: android android-ndk ogr


【解决方案1】:

当你在你的 ubuntu 机器上构建 libgdal.a 时,你必须有 sqlite3,它解析 #include "sqlite3.h"

这些包含文件对于静态库来说已经足够了,但是要创建 libgdaljni.so,您还需要 libsqlite3.a。您可以在同一台 ubuntu 机器上自己为 Android 交叉编译它,但获取预构建库可能是可以的,例如来自https://github.com/couchbase/couchbase-lite-java-native/tree/master/vendor/sqlite/libs/android

将此文件(用于适当的 ABI)复制到同一目录,并相应地修改您的 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := sqlite3
LOCAL_SRC_FILES := libsqlite3.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := sqlite3
include $(PREBUILT_STATIC_LIBRARY)

*continued without changes*

如果您仍然有“未定义的引用错误”,这可能意味着应该添加一些其他库。

【讨论】:

  • 非常感谢。它工作正常并且 sqlite3 错误消失了。但是还有另一个参考错误,我找不到我应该如何解决它们。对 std::__CXX11::basic_string 的未定义引用。你知道我应该怎么解决吗?
  • 其他“未定义的引用错误”有很多问题。我应该像你说的那样解决它们吗?
  • 并非所有未定义的参考错误都可以用相同的方式解决。例如。这个 std::__CXX11::basic_string - 它来自哪个文件?
  • /usr/include/c++/5/bits/basic_string.h:589 errorL undefined reference to 'std::__cxx11::__cxx11::basic_string, std::allocator>::swap...
  • 这来自一些不是为 Android 构建的模块。错误消息是否未提及某些 .a 或 .o 文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多