首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接.so库libc++_shared.so

链接.so库libc++_shared.so
EN

Stack Overflow用户
提问于 2019-03-15 13:53:19
回答 3查看 10.6K关注 0票数 6

在Android应用程序中,我的本机C++代码出现了错误

我的main.cpp

代码语言:javascript
复制
#include <stdio.h>

int main() 
{
  printf("Hello, world\n");
  return 0;
}

主.c完全相同。如果我跑了

代码语言:javascript
复制
/home/rip/Music/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android26-clang -pie main.c

然后

代码语言:javascript
复制
adb push a.out /data/local/tmp

代码语言:javascript
复制
adb shell /data/local/tmp/a.out

一切正常。但如果我跑了

代码语言:javascript
复制
/home/rip/Music/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android26-clang++ -pie main.cpp

然后

代码语言:javascript
复制
adb push a.out /data/local/tmp

代码语言:javascript
复制
 adb shell /data/local/tmp/a.out

错误信息是:

代码语言:javascript
复制
CANNOT LINK EXECUTABLE "/data/local/tmp/a.out": library "libc++_shared.so" not found

然后我试着跑

代码语言:javascript
复制
/home/rip/Music/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android26-clang++ -pie hello1.cpp  /home/rip/Music/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so

链接库,但无论如何都不起作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-16 20:34:08

我为解决方案写了一个新的答案,因为我不能编辑我的问题。解决方案是使用armv7对android设备执行以下命令:

代码语言:javascript
复制
/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi19 --gcc-toolchain=/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot main.cpp

对于aarch64 armv8,命令是:

代码语言:javascript
复制
/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot main.cpp

CMakeLists.txt文件应该如下所示:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_COMPILER /home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++)

project(Test CXX)

set(CMAKE_CXX_FLAGS "--target=aarch64-none-linux-android21 --gcc-toolchain=/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/tony/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot")

set(SOURCES
        main.cpp
        )

add_executable(Test ${SOURCES})

那么这个应用程序可以用

代码语言:javascript
复制
cmake

make

adb push Test /data/local/tmp

adb shell /data/local/tmp/Test
票数 0
EN

Stack Overflow用户

发布于 2021-03-14 11:13:06

错误信息是: 无法链接可执行文件"/data/local/tmp/a.out":找不到库"libc++_shared.so“

这就是人们所期望的行为。与标准C库不同(在使用简单*-clang进行构建时,您的程序正在链接到该库),C++不是一个系统库。您必须像其他任何第三方库一样,在设备上提供它。

引用自正式文件

注意: libc++不是系统库。如果您使用libc++_shared.so,,它必须包含在您的APK中。如果您正在使用Gradle构建应用程序,则将自动处理该应用程序。

和:

如果您在自己的构建系统中直接使用clang,clang++默认使用c++_shared。若要使用静态变量,请将-static-libstdc++添加到链接器标志中。

因此,通过将C++传递给编译器,可以静态地链接到-static-libstdc++。或者复制libc++_shared.so (在您的情况下从<NDK>/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/ )并运行如下:

代码语言:javascript
复制
adb push a.out libc++_shared.so /data/local/tmp/
adb shell
cd /data/local/tmp/
LD_LIBRARY_PATH=. ./a.out

除了上面讨论的LLVM标准C++库之外,还有一个有限的系统C++运行时(/system/lib(64)/libstdc++.so),它“提供对基本C++运行时ABI的支持”。但是“系统STL将在未来的NDK版本中被删除。”

票数 6
EN

Stack Overflow用户

发布于 2019-03-16 12:50:47

我在.c和.cpp文件中编译了相同的"hello“代码,当我将应用程序推到我的设备上时,没有同样的问题。我假设您有与本主题相同的问题:shared.so,当您手动调用clang时,这个问题可能来自您的工具链或工具链参数。

我创建了一个可以运行和测试的简单项目:android示例

代码语言:javascript
复制
add_executable( # Sets the name of the library.
    ndk_example_c

    # Provides a relative path to your source file(s).
    main.c
    )


add_executable( # Sets the name of the library.
        ndk_example_cpp

        # Provides a relative path to your source file(s).
        main2.cpp
        )

在生成的cmake脚本中,我可以看到cpp编译器的以下定义:

代码语言:javascript
复制
 rule CXX_COMPILER__ndk_example_cpp
  depfile = $DEP_FILE
  deps = gcc
  command = D:\Users\$USER\AppData\Local\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=armv7-none-linux-androideabi19 --gcc-toolchain=D:/Users/$USER/AppData/Local/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Users/$USER/AppData/Local/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot  $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $IN_ABS
  description = Building CXX object $out
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55184167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档