- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 <filesystem>
获取程序在 Windows 上运行的库。我正在使用 MSYS2(64 位)g++
.
#include <iostream>
#include <filesystem>
int main()
{
std::cout << "Hello World\n";
std::cout << "Current path is " << std::filesystem::current_path() << '\n';
}
我正在构建它
g++ -std=c++17 -Wall -Werror -Wextra main.cpp -lstdc++fs
我没有从编译器得到控制台输出。它默默地生成一个 a.exe
.执行 a.exe
什么都不做。没有输出,也没有错误。 $?
(据说包含程序的返回码)是127
运行程序后。
g++ -v
打印:
Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\g++.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-9.1.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev3, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 9.1.0 (Rev3, Built by MSYS2 project)
有什么问题吗?
(我得到 Hello World
输出并且 $?
是 0
,如果我用 std::filesystem::current_path()
调用注释掉该行,那么编译器正在工作。)
最佳答案
感谢评论者提出的一些想法,最终让我找到了解决方案。
如果您安装了各种基于 MinGW 的工具集(例如 Cygwin、MinGW、MSYS、< em>Git Bash),使用套件附带的 shell。小心地将 mingw*/bin
路径添加到 PATH
;而是坚持各自 shell 的默认 PATH
设置。 Click here, if you want to have convenient context menu shortcuts for the MSYS shell .
问题是由于我奇怪的本地设置。随着时间的推移,我在我的计算机上积累了各种版本的 MinGW。如果我需要一个实用程序,比如说 diff
,我会用谷歌搜索它并从某个地方下载一些东西(通常是 sourceforge),将它安装到某个地方并添加 bin
文件夹到我的 PATH
。这种策略适用于大多数情况。
我一直以来安装的工具集,包括但不限于:
很长一段时间以来,我大部分时间都在使用 Git Bash 来处理所有事情。最近我想获得最新的 g++
编译器和东西,发现 MSYS2 有一个包管理器 (pacman
) 和非常新的包所以我安装了它。并将其添加到 PATH
,然后使用 Git Bash。
但是,每个带有自己 shell 的工具集都有自己的 PATH
魔法,并且有自己的 MinGW 拷贝。所以我让我的 Git Bash 使用 MSYS2 g++
,但是从 Git Bash 执行的应用程序仍然使用来自Git Bash 的 MinGW 拷贝。我不确定,但我认为这很可能就是问题所在。
为了找到答案,我在 Git Bash 中使用了以下内容:
# because of my PATH adjustment, I got the right g++
$ which g++
/c/msys64/mingw64/bin/g++
# my program uses DLLs from /mingw64, though
$ ldd a.exe
ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77060000)
kernel32.dll => /c/Windows/system32/kernel32.dll (0x76e40000)
KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefcc00000)
msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefcf70000)
libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x61440000)
libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x64940000)
libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
USER32.dll => /c/Windows/system32/USER32.dll (0x76f60000)
GDI32.dll => /c/Windows/system32/GDI32.dll (0x7fefddb0000)
LPK.dll => /c/Windows/system32/LPK.dll (0x7fefd540000)
USP10.dll => /c/Windows/system32/USP10.dll (0x7fefdbe0000)
# with cygpath I can find out that this is actually the Git Bash's installation
$ cygpath -w /mingw64
C:\Program Files\Git\mingw64
MSYS2 带有自己的外壳,可以正确设置其 PATH
以便应用程序正常运行。在 MSYS2 外壳中:
$ ./a.exe
Hello World
Current path is "E:\\temporary\\2019_07_25-gpp_filesystem_test"
万一有人遇到类似的麻烦并希望在各种文件夹中更轻松地使用 MSYS2 shell,请使用 reg
脚本设置查看此 repo为 MSYS2 shell 设置方便的上下文菜单快捷方式:https://github.com/njzhangyifei/msys2-mingw-shortcut-menus
关于使用 <filesystem> 库的 C++ 程序在 Windows 上什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57208442/
有没有办法确定我是否可以使用标准 (在所有支持 C++17 的现代 C++ 编译器上可用)或 由较旧的编译器使用。 (例如 g++ 6.3,这是 Debian Stretch 上的当前标准版本) 知
因此,boost::filesystem 允许您在文件所有者拥有的权限、组拥有的权限以及所有用户拥有的权限的意义上访问文件的权限。这很好,但我不想开始检查我是谁,我的组是什么等等——我只想检查我是否可
我不小心使用 rm -rf 删除了错误的文件夹,我尝试过的每个工具都告诉我我没有硬盘或找不到文件系统。 当我输入 df 时,我得到: 已使用的文件系统大小 Avail Use% Mounted on
我是 Java 的新手,正在尝试学习 IO 的概念。我遇到过两个非常相似的 Java 类,FileSystem 和 FileSystems。它们之间有什么区别?什么时候使用一个而不是另一个? 最佳答案
我查了很多关于c++17下文件系统链接的问题,还是无法链接成功。我的main.cpp文件如下。 #include int main(int argc, char** argv) { std:
Boost 库有一个类来处理文件路径:boost::filesystem::path。Boos 也有这个类 boost::filesystem::wpath 每个类都有方法string(), wstr
我正在编写一个利用 std::filesystem 的库(仅供学习)。它在 MSVC 上运行良好,但是默认情况下,Linux 的 LTS 版本就像 Ubuntu 一样附带 GCC 6.x,官方存储库中
请查找随附的代码片段。我正在使用此代码将文件从 hdfs 下载到我的本地文件系统 - Configuration conf = new Configuration(); FileSys
这段代码中std::filesystem::copy()和std::filesystem::copy_file()有什么区别? #include void testing() { const
以下代码旨在去除路径的第一部分,以防它存在: #include std::filesystem::path strip_prefix(std::filesystem::path p) {
在以下两种情况下,是否有理由调用lexically_normal: std::filesystem::path filepath = someFuntionThatGetsAPath(); filep
函数 boost::filesystem::canonical() ( doc of 1.66 , doc of current release ) 提供两个参数(忽略错误代码重载)base。第一个是
boost::filesystem::path使用 &转义路径字符串中的引号,see demo : std::cout 标题。 最佳答案 Boost::Filesystem 相当古老,早于 C++14
考虑以下关于路径分解的断言,其中每个局部变量,例如stem 具有明显的初始化,例如auto stem = path.stem() — assert(root_path == root_name / r
给定以下代码: fs::path p{ "a/b/" }; fs::path q{ "a/b/." }; assert(p == q); [注意定义 q 的字符串末尾的额
由于 C++17 std::filesystem 与 boost::filesystem 非常相似,所以我尝试做与这个问题相同的事情: Escaping some Directories in ite
我找到了这个页面,描述了 c++14 和 c++17 之间的变化: https://isocpp.org/files/papers/p0636r0.html ... 它链接到此页面,该页面描述了建议的
我有一些代码,当我编译它时,出现以下错误,我不知道如何解决。我尝试添加 -L/usr/lib/x86_64-linux-gnu、-lboost_system 和 -lboost_filesystem,
尝试使用 Asset.loadAsync 将 .txt Assets 作为字符串加载到 Expo 中 Asset.loadAsync(module) 解析并提供一个 localUri 但是,FileS
我在 中编码C++ 在 Visual Studio (Windows 10)并收到此错误: #error The header providing std::experimental::filesy
我是一名优秀的程序员,十分优秀!