代码之家  ›  专栏  ›  技术社区  ›  Luther

需要“cpufeatures”的外部NDK库的链接器错误

  •  3
  • Luther  · 技术社区  · 6 年前

    我正在尝试构建freeimage并将其链接到android项目。我很接近,但我被该库中的一些链接器错误绊倒了。

    我正在使用此回购: https://github.com/jamcar23/FreeImage-Android/blob/master/jni/freeimage/Android.mk

    Freeimage使用内部NDK库“cpufeatures”来使用xeon芯片组功能。在项目的“android”中。mk',有一个对cpufeatures库的引用:

    LOCAL_STATIC_LIBRARIES := cpufeatures
    

    而静态链接到此库的my library,也在该项目的android中的LOCAL\u STATIC\u LIBRARIES语句中包含cpufeatures。mk:

    LOCAL_STATIC_LIBRARIES := tinyxml freetype2 bullet freeimage cpufeatures
    

    也在我的android中。mk,我链接freeimage如下:

    #####FREEIMAGE_LIBRARY_DECLARATION##########
    include $(CLEAR_VARS)
    LOCAL_PATH = $(TPLIBROOT)/FreeImage-Android
    LOCAL_MODULE := freeimage
    LOCAL_EXPORT_C_INCLUDES := include
    LOCAL_SRC_FILES := obj/local/$(TARGET_ARCH_ABI)/libFreeImage.a
    include $(PREBUILT_STATIC_LIBRARY)
    ###############################################
    

    注意到我之前关于NDK的一个问题,应该考虑特定的架构(我已经使用所有可用的架构构建了freeimage)

    freeimage。a和。因此,库似乎构建得很好,但在构建时需要链接到我的库。所以,我得到了这个错误:

    [armeabi-v7a] SharedLibrary  : libAnthracite.so
    jni/freeimage/Source/LibWebP/./src/dsp/dsp.cpu.c:108: error: undefined reference to 'android_getCpuFamily'
    jni/freeimage/Source/LibWebP/./src/dsp/dsp.cpu.c:109: error: undefined reference to 'android_getCpuFeatures'
    jni/freeimage/Source/LibWebP/./src/dsp/dsp.dec.c:745: error: undefined reference to 'VP8DspInitNEON'
    

    这很奇怪,因为两个库都链接CPuffeatures,所以它真的应该存在。

    我宣布

    APP_PLATFORM := android-14
    APP_STL := gnustl_static
    

    在应用程序中。两个项目的mk文件。 此外,我还尝试将“LOCAL\u STATIC\u LIBRARIES”放置在文件中的不同位置,并以不同的顺序链接库,尽管这只是猜测。 有人知道这些链接器错误的原因吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alex Cohn    6 年前

    请按照 official guide 添加cpu功能。TL;编号:添加 $(call import-module,android/cpufeatures) 到您的 安卓mk公司

        2
  •  0
  •   Luther    6 年前

    通过确保我所有的应用程序都正常运行,我最终实现了这一目标。我使用的所有四个第三方库的mk文件共享了一个公共基文件,如下所示:

    APP_PLATFORM := android-15
    APP_STL      := c++_static
    APP_ABI      := all    
    APP_OPTIM    := release
    APP_SHORT_COMMANDS := true
    

    这使得它们更容易保持一致,确保它们都是根据相同的库构建的。 此外,我将STL实现从“gnustl\u static”更改为“c++\u static”