Clang 链接 .so 库 libc++_shared.so
Clang linking .so library libc++_shared.so
我在 Android NDK 应用程序
中的本机 C++ 代码中遇到错误
我的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
到 link 库,但无论如何它都不起作用。
我在 .c 和 .cpp 文件中编译了相同的 "hello world" 代码,将应用程序推送到我的设备时没有遇到同样的问题。我假设您遇到与本主题相同的问题:
Application can't find libc++_shared.so
问题可能来自您的工具链或工具链参数,因为您正在手动调用 clang。
我创建了一个简单的项目,您可以 运行 并进行测试:
android-ndk-example
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
我为解决方案写了一个新答案,因为我无法编辑我的问题。
对于 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
The error message is:
CANNOT LINK EXECUTABLE "/data/local/tmp/a.out": library "libc++_shared.so" not found
这是预期的行为。与标准 C 库(您的程序在使用简单 *-clang
构建时 linking 不同)不同,C++ 不是系统库。您必须像任何其他第三方库一样在设备上提供它。
Note: libc++ is not a system library. If you use libc++_shared.so, it must be included in your APK. If you're building your application with Gradle this is handled automatically.
并且:
If you're using clang directly in your own build system, clang++ will use c++_shared
by default. To use the static variant, add -static-libstdc++
to your linker flags.
因此,通过将 -static-libstdc++
传递给编译器,静态地使用 C++ link。或复制 libc++_shared.so
(在您的情况下来自 <NDK>/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/
)和 运行,例如:
adb push a.out libc++_shared.so /data/local/tmp/
adb shell
cd /data/local/tmp/
LD_LIBRARY_PATH=. ./a.out
除了上面讨论的 LLVM 标准 C++ 库之外,还有一个有限的系统 C++ 运行time (/system/lib(64)/libstdc++.so
) “提供对基本 C++ 运行时 ABI 的支持” 。但是 “系统 STL 将在未来的 NDK 版本中删除。”
我在 Android NDK 应用程序
中的本机 C++ 代码中遇到错误我的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
到 link 库,但无论如何它都不起作用。
我在 .c 和 .cpp 文件中编译了相同的 "hello world" 代码,将应用程序推送到我的设备时没有遇到同样的问题。我假设您遇到与本主题相同的问题: Application can't find libc++_shared.so 问题可能来自您的工具链或工具链参数,因为您正在手动调用 clang。
我创建了一个简单的项目,您可以 运行 并进行测试: android-ndk-example
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
我为解决方案写了一个新答案,因为我无法编辑我的问题。 对于 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
The error message is:
CANNOT LINK EXECUTABLE "/data/local/tmp/a.out": library "libc++_shared.so" not found
这是预期的行为。与标准 C 库(您的程序在使用简单 *-clang
构建时 linking 不同)不同,C++ 不是系统库。您必须像任何其他第三方库一样在设备上提供它。
Note: libc++ is not a system library. If you use libc++_shared.so, it must be included in your APK. If you're building your application with Gradle this is handled automatically.
并且:
If you're using clang directly in your own build system, clang++ will use
c++_shared
by default. To use the static variant, add-static-libstdc++
to your linker flags.
因此,通过将 -static-libstdc++
传递给编译器,静态地使用 C++ link。或复制 libc++_shared.so
(在您的情况下来自 <NDK>/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/
)和 运行,例如:
adb push a.out libc++_shared.so /data/local/tmp/
adb shell
cd /data/local/tmp/
LD_LIBRARY_PATH=. ./a.out
除了上面讨论的 LLVM 标准 C++ 库之外,还有一个有限的系统 C++ 运行time (/system/lib(64)/libstdc++.so
) “提供对基本 C++ 运行时 ABI 的支持” 。但是 “系统 STL 将在未来的 NDK 版本中删除。”