C++ 发出叮当声++;:错误:编译包含文件系统库的代码时

C++ 发出叮当声++;:错误:编译包含文件系统库的代码时,c++,cmake,android-ndk,C++,Cmake,Android Ndk,我试图在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.63

我试图在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>
cmake build.gradle中的内容:

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++")
还尝试:

target_link_libraries(native-lib1 -lstdc++)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -stdlib=libc++")
其中native-lib1是我试图添加的库。但它不起作用。 我的NDK版本是:21.1.6352462


请建议一些解决方法。

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

我在VisualStudio的控制台应用程序中这样做


但是,我希望这能有所帮助。

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

我在VisualStudio的控制台应用程序中这样做


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

std::filesystem
的支持看起来将在Android NDK r22中实现:

这个实现现在签入到master,并将在r22中。我已经把剩下的测试清理工作分岔到了#1265中,所以我可以关闭它,让大家清楚地看到,你们关心的部分是完整的,而不必通读全部内容:)


链接线程有一些变通方法,比如使用
boost::filesystem
或者自己构建
std::filesystem
库(
libc++fs

std::filesystem
的支持似乎将登陆Android NDK r22:

这个实现现在签入到master,并将在r22中。我已经把剩下的测试清理工作分岔到了#1265中,所以我可以关闭它,让大家清楚地看到,你们关心的部分是完整的,而不必通读全部内容:)


链接线程有一些变通方法,比如使用
boost::filesystem
或者自己构建
std::filesystem
库(
libc++fs

您是否将代码构建为C++17(
-std=C++17
)?@JesperJuhl,我已经在cmakeLists中添加了set(CMAKE_CXX_标准17)。txt您是否将代码构建为C++17(
-std=C++17
)?@JesperJuhl,我已经添加了set(CMAKE_CXX_标准17)在cmakeLists.txt中,当使用Clang为Android构建时,这不会起多大作用。当使用Clang为Android构建时,这不会起多大作用。您能否详细介绍一下如何准确构建它?事实上,有一个单一的文件库,它是API兼容的:建议使用它,而不是从头开始构建C++部分。你能详细说明如何正确地构建它吗?事实上,有一个单一的文件库,它是API兼容的:建议使用它,而不是从头开始构建C++部分。