首页 > 解决方案 > 如何在 Visual Studio 的 Android 共享库 (.so) 项目中正确使用 c++ 静态库 (.lib)?

问题描述

我需要为一个项目创建一个 .so Android 共享库,并且我需要使用来自 C++ 静态库 (.lib) 的函数。.so 库只是用作桥梁,因此我可以在 Android 应用程序和游戏中使用我的静态库中的函数。我在 Visual Studio 2017 中创建了一个 C++ 跨平台 Android 项目(也在 VS2019 中对其进行了测试),包括静态库的头文件和库本身,并且所有内容都在理论上进行了配置和链接。

我正在使用的当前库是一个简单的静态库,用于测试,只有一个函数:

namespace StaticLibrary
{
    extern "C" void Func() 
    {
        // something
    }
}

Android 的文件如下所示:

#include "StaticLibraryHeader.h"
extern "C"
{
    // ...

    void StaticLibFunc()
    {
        StaticLibrary::Func();
    }
}

当我尝试编译项目时,编译器说:

C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Build\x64\Debug\libStaticLibTest_x64_Debug.lib: bad extended name index at 778

和:

undefined reference to 'Func'

我可以通过使用链接器的 --whole-archive 选项来消除第二个错误,但随后会出现这个新错误以及第一个错误:

C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: fatal error: F:\Android_IOS_libs\MobileLibraries2019\Build\x64\Debug\libStaticLibTest_x64_Debug.lib: attempt to map 60 bytes at offset 6324 exceeds size of file; the file may be corrupt

我还使用 Google Lib2A ( https://code.google.com/archive/p/lib2a/ ) 创建了一个 .a 文件,但随后发生以下错误:

C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Krilloud_Android\lib\x64\libStaticLibTestDLL_x64_Debug.a: member at 192 is not an ELF object
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Krilloud_Android\lib\x64\libStaticLibTestDLL_x64_Debug.a: member at 870 is not an ELF object
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Krilloud_Android\lib\x64\libStaticLibTestDLL_x64_Debug.a: member at 1656 is not an ELF object

我不是 Android/Java 开发人员,所以我在这里迷路了。如何在 .so 项目中正确链接和使用我的静态库?可以使用 Visual Studio 完成,还是我真的需要为此安装 Android Studio?我还需要为 iOS 创建相同的东西,所以我希望在 Visual Studio 解决方案中拥有这两个项目。

标签: androidc++visual-studioshared-librariesstatic-libraries

解决方案


推荐阅读