获取 clang++:错误:编译包含文件系统库的代码时

Posted

技术标签:

【中文标题】获取 clang++:错误:编译包含文件系统库的代码时【英文标题】:Getting clang++: error: while compiling code contaning filesystem library 【发布时间】:2020-06-14 09:59:17 【问题描述】:

我正在尝试在 android 项目的本机代码中使用文件系统。但收到此错误:

失败:

C:/Users/Johnsnow/AndroidStudioProjects/abc/Application/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib1.so 
cmd.exe /C "cd . && C:\Users\Johnsnow\AppData\Local\Android\Sdk\ndk\21.1.6352462\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=C:/Users/Johnsnow/AppData/Local/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/Johnsnow/AppData/Local/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security   -stdlib=libc++ -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libnative-lib1.so -o C:\Users\Johnsnow\AndroidStudioProjects\abc\Application\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib1.so @CMakeFiles/native-lib1.rsp  && cd ."
C:/Users/Johnsnow/AppData/Local/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1/filesystem:1615: error: undefined reference to 'std::__ndk1::__fs::filesystem::__status(std::__ndk1::__fs::filesystem::path const&, std::__ndk1::error_code*)'
C:/Users/Johnsnow/AppData/Local/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1/filesystem:1637: error: undefined reference to 'std::__ndk1::__fs::filesystem::__file_size(std::__ndk1::__fs::filesystem::path const&, std::__ndk1::error_code*)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

我包含它的方式是:

#include <filesystem>

在我使用的 c++ 代码中:

std::filesystem::path

build.gradle 中的 cmake 内容:

externalNativeBuild 
            cmake 
                arguments '-DANDROID_PLATFORM=android-16',
                        '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_shared'
            
        

尝试的选项:

我尝试在 cmakeLists.txt 中添加 libc++

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -stdlib=libc++")

也试过了:

target_link_libraries(native-lib1 -lstdc++)

也试过了:

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++17 -stdlib=libc++")

native-lib1 是我要添加的库。但它不起作用。 我的 NDK 版本是:21.1.6352462

请提出一些解决方法。

【问题讨论】:

您是否将代码构建为 C++17 (-std=c++17)? @JesperJuhl,我已经在 cmakeLists.txt 中添加了 set(CMAKE_CXX_STANDARD 17) 【参考方案1】:

std::filesystem 的支持看起来将登陆Android NDK r22 at the earliest:

这个实现现在已经签入到 master 并且将在 r22 中。我已将剩余的测试清理工作分叉到 #1265 中,因此我可以关闭它以清楚地表明你们关心的部分是完整的,而无需阅读整个内容:)

链接的线程有一些解决方法,比如使用boost::filesystem 或自己构建std::filesystem 库(libc++fs)。

【讨论】:

你能详细说明一下如何构建它吗?提前致谢。 实际上,有人在谈论一个与 api 兼容的单文件库:github.com/gulrak/filesystem 建议使用它而不是从头开始构建 c++ 部分。【参考方案2】:

为了让std::filesystem 工作,我所做的是将解决方案平台更改为x64,而不是默认的Win32

我是在 Visual Studio 上的控制台应用程序中执行此操作的。

不过,我希望这会有所帮助。

【讨论】:

在使用 Clang 为 Android 构建时不会有太大作用。

以上是关于获取 clang++:错误:编译包含文件系统库的代码时的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标

如何以clang格式创建外部标题的类别?

未找到 macOS Clang C++17 文件系统标头

如何让clang忽略c-c++不兼容错误?

深入研究Clang(十八) Clang Driver库的job

深入研究Clang(十八) Clang Driver库的job