問題タブ [std-filesystem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++17 - Windowsでmingw32-makeおよびmsys2でstd::filesystemを使用するにはどうすればよいですか
Windows で Linux コードをコンパイルしようとしています。std::filesystem を使用しているため、ブロックされます。したがって、この投稿に従って最小限の例を実行しようとしています:
Windows 10 で nuwen MinGW を使用する C++17 ファイルシステム
私は同じコードを使用します:
msys2を使用しています。OK、 g++ -std=c++17 ../main.cpp を実行すると、うまく機能します:
現在のパスは「C:\Users\Guillaume\Documents\dev\C++\test\filesystem\build」です
しかし、私のプロジェクトは明らかに大きすぎて、g++ だけで使用することはできません。だから私はcmakeとmingw32-makeを使います。しかし、それは機能せず、上の投稿と同じエラーが発生します。補足情報:
と
私の質問: msys2 の下で mingw32-make を使用してコードをコンパイルできるようにするにはどうすればよいですか?
edit : エラーの開始 (stackoverflow には大きすぎる)
および CMakeLists.txt :
編集2:
環境パスを変更し、C:\tools\msys64 を一番上に置きました。
私はcmake-guiを使用しています。構成のログは次のとおりです。
set(CMAKE_VERBOSE_MAKEFILE ON) からのログ:
私の CMAKE_CXX_COMPILER はまだ C:/ProgramData/chocolatey/bin/g++.exe です。それはおそらく問題です...しかし、どうすればよいですか?
c++ - LoadLibrary() バリアントの 1 つで使用するために、std::filesystem::path を LPCSTR に変換するにはどうすればよいですか?
Windows では、 のバリアントの 1 つを使用して、以前に に書き込まれたLoadLibrary()
を で開こうとしています。 dll
std::filesystem::path
ofstream
注:実行時にリンクすることで標準の方法で使用できるため、dllが正しく記述されていることはわかっています。
以下の2つの回答の方法を組み合わせようとしています。
これはかなり基本的なことのように思えますが、これまでに試したことは何でも LPCSTR への変換に関するエラーが発生するか、C2228: left of '.c_str' must have class/struct/union
困惑しているようなものです。
簡単な例を次に示します。
LoadLibraryA()
マクロを避けて直接呼び出してみましたが、うまくいきませんでした。、、 path1.wstring() などpath1
で渡すさまざまな方法も試しましたが、うまくいきませんでした。また、 内でのキャストを回避するために、さまざまな方法で一時変数を使用してみました。path1.string()
path1.string.c_str()
LoadLibrary()
エンコーディング(など)を試してみたいと思っていますが、直接path1.u8string()
使用する必要はないと思います。LoadLibraryA()
私は C のキャストを避けようとしており、c++ の static_ または dynamic_ を好みますが、動作するものは何でも使用します。
どんな助けでも大歓迎です。
前もって感謝します。
UPDATE
@eryk-sunのコメントと@Gulrakの回答で解決しました。path1.c_str()
私のセットアップでは、それだけのように見えますwchar_t
が、LoadLibrary() マクロはそれを取得して LoadLibraryW() に指示していませんでした。
注:将来これに出くわす可能性のある他の人のために、私の特定のセットアップの詳細を次に示します。16.1.0 (~VS2019) の MSVC コンパイラを使用していますが、これは VSCode と CMake から呼び出されています。私は_UNICODEを明示的に定義していませんが、VSCodeのインテリセンスは確かにそれがどこかで定義されていると考えており、LoadLibraryA()を指しています。ただし、コンパイラは実際にはその定義を見ていないためpath1.c_str()
、wchar_t
.
c++ - 特別なパス部分を持つ `std::filesystem::weakly_canonical` が失敗する
いくつかのパーツで構成されたパスがあり、最終的には特別なパス パーツが含ま/../../
れ、右側にはいくつかの仮想パーツが含まれています。特殊な部分の左側では、パスは実際のパスに評価できます。参考文献によると、仮想的な部分は問題なく、それ自体は問題ではありません。
パスstd::filesystem::weakly_canonical
が無効であるために失敗します(存在しないファイル/フォルダーだけでなく、問題ありません)。..
これは、言及されている特別な部品のためだと思います。
weakly_canonical
特別なパーツを処理するために渡す前に呼び出すことができるものはありますか?
std::filesystem::make_relative
実際には、別のパスに対して呼び出したいと思います。これweakly_canonical
は、入力を呼び出します。
c++ - std::filesystem::operator==() が異なるパス区切り文字を持つ 2 つの UNC パスを比較すると false を返すのは正しいですか?
Visual Studio 16.0.0でコンパイルしたときの次の動作にstd::filesystem::path
気付きましたが、正しいかどうか疑問に思っています。
私はパスの専門家ではないので、2 番目のケースでパスが等しくないことに意味があるかどうかはわかりません。これは正しい動作ですか?
c++ - C++ std::filesystem::copy が「ネットワークの場所に到達できません」で失敗する
いくつかのクライアントで Windows が起動した後に自動的に開始される小さな C++ アプリケーションを作成しました。このアプリケーションは、ネットワーク共有 (すべてのクライアントで同じネットワーク共有) からローカル ディスクにファイルをコピーします。すべてのクライアントを一度に再起動すると、多くのクライアントで std::filesystem::copy 関数からエラー 1231 が発生し、次のメッセージが表示されます。
「ネットワークの場所にアクセスできません」
すべてのクライアントを数秒間隔で再起動しても問題はありません。これは、コピー中にコピー機能がファイルをブロックしている可能性があると思います。
これを防ぐために欠けている設定はありますか?これは正常な動作ですか?
編集:ネットワークの問題を修正できましたが、「別のプロセスで使用されているため、プロセスはファイルにアクセスできません」というエラー 32 が表示されます。コピー機能は、現在コピー中のファイルをロックしますか?