Clang, связывающий .so библиотеку libc ++ _ shared.so - PullRequest
1 голос
/ 15 марта 2019

У меня ошибка в моем родном коде C ++ в приложении Android NDK

Мой main.cpp

#include <stdio.h>

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

Файл main.c точно такой же.Если я запускаю

/home/rip/Music/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android26-clang -pie main.c

, то

adb push a.out /data/local/tmp

и

adb shell /data/local/tmp/a.out

все работает нормально.Но если я запускаю

/home/rip/Music/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android26-clang++ -pie main.cpp

, то

adb push a.out /data/local/tmp

и

 adb shell /data/local/tmp/a.out

Сообщение об ошибке:

CANNOT LINK EXECUTABLE "/data/local/tmp/a.out": library "libc++_shared.so" not found

Тогда я попыталсязапустить

/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

, чтобы связать библиотеку, но она все равно не работает.

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Я пишу новый ответ для решения, потому что я не могу редактировать свой вопрос.Решение - следующая команда для устройств Android с armv7:

/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 команда выглядит так:

/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 должен выглядеть так:

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})

Тогда приложение может собрать с

cmake

make

adb push Test /data/local/tmp

adb shell /data/local/tmp/Test
0 голосов
/ 16 марта 2019

Я скомпилировал один и тот же код "hello world" в файлах .c и .cpp, и у меня не было такой же проблемы, когда я отправил приложение на свое устройство. Я предполагаю, что у вас та же проблема, что и в этой теме: Приложение не может найти libc ++ _ shared.so Проблема может быть связана с параметрами вашей цепочки инструментов или цепочки инструментов, когда вы вызываете clang вручную.

Я создал простой проект, который вы можете запустить и протестировать: андроид-NDK-пример

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:

 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
...