Cygwin + MinGW + GCC 相談室 Part 8
>>553 おお、ありがとう ダウンロードしてみる TDM-GCCでビルドしたら遅いの無くなったかもしれない(*´Д`)!!! >>551 >>553 もう少し様子見るけど、まじでありがとう >>555 これはMinGWとは違うの? staticになってるだけというオチだったらわろす ただ単に -static -O3 -mtune=skylake を指定していないだけ じゃねえだろうな? staticオプションは特に指定しませんが…… dllの読み込みが原因だとしたらstaticにすれば解決という話ですか そういう発想はなかった >>558 --mtune=skylakeってなんですか? >>559 -O3はコードの最適化を3レベル(あるいはタイプ3)で行う 実際に何を行っているかはコンパイランの説明を読まないと分からない -mtune=skylakeはコードをIntel CPUのSkyLakeアーキテクチャで最適な形にする どちらも記述したコードを実行形式にするときに最適化を行うオプションなので、 非常に大きなコードを書いた際や似たような処理を繰り返すコードを書いている際に 指定すると早くなる事もある(ライブラリに含まれるコードは最適化されない) >>560 都市伝説ってこともない 関数A、B、C、Dが含まれるライブラリlibhogeが存在する場合、自分のプログラムで 関数BとDだけを使っていると、ダイナミックリンクの場合自分のプログラムの実行 コードに加えてすべての関数が含まれるlibhoge.dll全体を読み込む必要がある スタックリンクの場合には自分のプログラムの実行コードに加えてlibhoge.aから抽出した 関数BとDのコードを読み込むだけなので関数AとCのコードを読み込まない分ロードが 早くなる可能性は高くなる ただし、実際問題としてはdllを一回読み込めばキャッシュからなくならない限り読み込む 必要がない+Windowsのプログラミングで使用するライブラリで基本的なものは通常 システムを起動した時点でキャッシュされていることに加えて、Windowsでプログラムを 動かすために必要な関数郡はかなりの量になる事が多いのでスタティックにリンクすると すでにキャッシュされている関数郡を使わずに、必要な関数郡を含んだ大きなコードを 読み込む必要があるのでスタティックリンクの方が起動が遅くなるって本末転倒な事態が 発生することもある MinGWの場合にはWindows一般では使わないライブラリを使用するので1回目の 起動時には必要なdllを読み込むよりは、必要な関数のみをリンクしたスタティックな 状態の方が早い場合があるかもってこと >>561 ということは--static -O3 -mtune=skylakeでビルドすれば起動が早くなるかもということですか 時間があるときに試したいと思いますm(_ _)m やっぱり名前解決の問題が大きいんすよ ライブラリの読み込みだけでは説明できない >スタックリンクの場合には自分のプログラムの実行コードに加えてlibhoge.aから抽出した >関数BとDのコードを読み込むだけなので関数AとCのコードを読み込まない分ロードが これ関数単位でソース分けてあって 一関数が一objになってる場合だけだよな >スタックリンクの場合には自分のプログラムの実行コードに加えてlibhoge.aから抽出した >関数BとDのコードを読み込むだけなので関数AとCのコードを読み込まない分ロードが これ関数単位でソース分けてあって 一関数が一objになってる場合だけだよな dll読み込みってそんなに重いかな? なんか別のところで時間がかかっていそうな感じ。 >>565-566 MinGWの場合はそうかな。確かMinGWでは--gc-sectionsが効かなかったかと。 LTOで未使用関数が除去されるかもしれないけどバグが多いので試してない。 >>563 でビルドしてみました 様子見します -O3は、前にビルドしたときにプログラムがうまく動作しないことがあったんですよね -O0にすると正常に動作したんですけど -O3と-O0で挙動が違うのは、不定の値を使っているとか、 未規定の動作に依存しているとか、そういう系だぞ まれにコンパイラのバグということもあるが大抵てめーが悪い VCで造られたdllをmingwのgccで使いたいです hoge.dll と hoge.lib は有るのですが libhoge.a がありません あと hoge.c とかのソースファイルもありません hoge.def は hoge.dll から作れるのですが hoge.lib から libhoge.a を作るのはどうすればよかったか思い出せません https://stackoverflow.com/questions/8683046/compatibility-of-dll-a-lib-def-between-visualstudio-and-gcc dlltool.exe -m i386:x86-64 -d libhoge.def -D hoge.dll -l libhoge.a dlltool.exe -m i386 -d libhoge.def -D hoge.dll -l libhoge.a しらんけど 実際parallelstlをコンパイルするのはVCの方が楽だしな これを.aに変換したいと思っていたのでありがたいです 9.2.0 Rev2 でPCHのエラーが出なくなった。 本物のWInネイティブアプリの起動はもっと速いのかもしれません。 MinGW+MSYS2がCygwinより速い理由が釈然としませんが、 forkがCygwinのものまんまよりは多少軽量だったりするんだろうか https://twitter.com/nullpo_head/status/905032098506915840 https://twitter.com/5chan_nel (5ch newer account) cygwin の fork = native じゃなくて emu mingw の fork = あるんか? MinGW+MSYS2がCygwinより速い理由は Cygwinはたとえ遅くなろうとも完璧なエミュレートを目指してるのに対して MinGW+MSYS2は目指してないから MSYS2は、Windowsネイティブアプリを作るための環境です。 Windowsネイティブアプリを作りましょう。 GMPって真面目にソースtarからビルドするしかないの? ビルド済みのバイナリですぐ使えるのがあれば欲しいんだけどcygwinのインストーラでチェック入れてもダメで、なんじゃこりゃってなってるんだけど。 >>589 どうでもいいことだが Stack Overflow のURLは削れる。 build - Are there any recent GMP Windows binary distributions? - Stack Overflow https://stackoverflow.com/questions/19192963 msys2のpacmanでfdupesがないんですけど、どっからか手に入りますか? 長期間更新がありませんが何か支障があるのでしょうか・・ Cygwin って /cygdrive上ではディレクトリまたげないんだけど、これってそんなもんだったっけ? かなり久しぶりにCygwinを使おうとしているのだが困っている。 ディレクトリ構成 D:\DEV\debug で 下のディレクトリから上のディレクトリのファイルをコピーする、以下のコマンドが通らない。 MyMachine@MyName /cygdrive/d/dev/debug $ cp ../some_file . ディレクトリまたげないんだけど、こんなんだったっけ? なお / をバックスラッシュにしても駄目。 なお/home以下のディレクトリならこれらのコマンドは通る。あまり試していないが、おそらく、/cygdrive以下だけ駄目。 何か設定がおかしい?それともこんなものだったっけ? なお今のところディレクトリをまたげないだけでカレントについてはコマンドは通る。 >>600 すまぬ自己解決した。 debugがシンボリックリンクだったorz >>602 それはそうだが普段シンボリックリンクである事なんて意識しないからな。 いまだにcygwinではNTFSのシンボリックリンクを辿れないのはしょぼいと思うが。 なお32bit版。bashはversion4.4.12(3)、cygwin1.dll はversion 3001.2.0.0 (昨日の時点でsetup.exeを使いBestに更新) 64bit版なら行けるのかも?誰か動作報告よろしく。 NTFSのリンクはシンボリックリンクではないでしょ シンボリックリンクあるよ、ジャンクションじゃないやつ >>605 シンボリックリンクはSever2008/Vistaから導入された。もう10年以上前になる。 https://www.atmarkit.co.jp/fwin2k/win2ktips/988symlink/symlink.html つかお前、このレベルの話を知らないでその言い草は完全に老害化してるぞ。 mklink /? で普通に表示されるのに それすらやったことないのか? 共有フォルダ作るときなんか シンボリックリンクとジャンクションの違いを知らないと困るだろうが >>604 シンボリックリンクもジャンクションも辿れるし、環境変数の設定(CYGWIN=winsymlinks:nativestrict)によってはln -sやtarの展開でNTFSのシンボリックリンクができる NTFS側でD:とかをリンク先にしても、勝手に/cygdrive/d以下に読み替えてくれる cygdrive以下だけ動かないなら、/etc/fstabの設定がおかしいとか? だけどシンボリックリンクωを名乗ってるだけでシンボリックリンクではないですねこれ Windowsには 1.ハードリンク 2.ジャンクション 3.あほなシンボリックリンク 4.だるいシンボリックリンク がある >>611 すまんが、/cygdrive以下だけ動かない、というのは間違いだった。 動作としては、シンボリックリンクを辿ることは出来るが、戻れない、というものだ。 本来はシンボリックリンクはカレントと共に使用される。 つまりD:/dev/debugがシンボリックリンクでそこにD:/devからcdして入ったら、 cd .. だとD:/devに戻って来れないといけない。 (シンボリックリンク先に入った時の元に戻る。他から入ったらそこに当然戻る) これが出来ておらず、debugしかないディレクトリ(というものを作って渡しているのだと思う)に戻ってしまう。 だから下から上が参照出来ない。上から下は参照出来るし、 下から上でも自分に戻ってくるのなら参照出来る。(言葉だと分かりにくいが要するに以下が通る) MyMachine@MyName /cygdrive/d/dev/debug $ less ../debug/some_file 下から上でもファイル名の補完は出来るのでbash自体は動作してる。 なお cd ../.. とシンボリックリンクを跨いで2つ上がることは可能。 cdってbashのコマンドだっけ?だとして、やはりbash自体は動作してる。 bashから各アプリに渡す時に失敗しているか、cygwin1.dll自体が対応してないか、だと思う。 バグ報告してもいいけど、それ以前に64bit環境の動作を確かめてからでないとウザがられる。 というわけで普段から64bit環境で使っている人がいたら試してみてくれ。 >>612 いや完全にシンボリックリンクだよ。 ln -s と使い勝手は同じ。 cygwinはもう永眠させてやれ WSLに乗っ取られた >>615 何をしようとしているか大体分かった。 ・/cygdrive/d/dev/debug はシンボリックリンクで /cygdrive/d/test/debug を指すと仮定 ・/cygdrive/d/dev/some_file があると仮定 このとき ・まずcd /cygdrive/d/dev/debugする ・次にcp ../some_file .するとファイルが無いと言われる ということだと思う。もしそうならそれがUNIX系では普通。LinuxやMacでもそうなる。 これは、cdした時点で既にカレントディレクトリが/cygdrive/d/test/debugに移っているからで、cpは/cygdrive/d/test/some_fileを読もうとしているために起こる。つまり >本来はシンボリックリンクはカレントと共に使用される。 がUNIX的には正しくない。 実際の挙動としては、 ・UNIXの場合、カーネル的にはカレントディレクトリはあくまでもディレクトリで、シンボリックリンクをパスの途中に含むことはできない ・cd ..でもといたディレクトリに戻るのはbashがシンボリックリンクを本当のデイレクトリのようにエミュレーションしているから(set -Pで切れる) ・これは基本的には内部コマンドのcdやpwdに対してのみできることで、外部コマンドのcpやlessに対してはできない(引数の..が親ディレクトリの意味になるかはコマンドに依存するから、シェルが勝手に置き換えられない) ・シェルはPWD環境変数にシンボリックリンクを含むロジカルなカレントディレクトリを出力するので、これを見るようにすれば原理的には外部コマンドもエミユレーションに対応できる(危なっかしいので普通はしない) WindowsのシンボリックリンクはUNIXと違ってOS自体がシンボリックリンクを含むカレントディレクトリを扱っているようだが、CYGWINはUNIXに合わせていると考えられる。 >>618 こちらの状況は正しく伝わっており、君の言っていることも正しい。 こちらも615を書いた後、遠い昔にシンボリックリンク周りでトラブった記憶があり、 あれはなんだったかな?と思っていたところだった。 つまりbashで上手く誤魔化していてくれているわけだ。 ではtcshは?と確認したが、こちらもsymlinks変数で誤魔化し方を調整出来るようになっている。 https://linuxjm.osdn.jp/html/tcsh/man1/tcsh.1.html 結果、Cygwinとしては仕様通り、UNIXは糞仕様(≒仕様バグ)だな。 突っ込む必要はないと思うが、 > (引数の..が親ディレクトリの意味になるかはコマンドに依存するから、シェルが勝手に置き換えられない) これはよく分からない。 bashがコマンドに引数を渡すときにあらかじめシンボリックリンク周りを解決していたら、どういう問題が発生する? というかtcshだとsymlinks=expandに設定したらそうなるらしい。 今回で言えば、 MyMachine@MyName /cygdrive/d/dev/debug $ cp ../some_file . を cp /cygdrive/d/dev/somefile /cygdrive/d/dev/debug として実行すれば問題ないはず。 (.を展開する必要はないかもだが) 既存シェルスクリプトの互換性が無くなるだけなら仕様バグでした、残念でした、でしかなく、 後発のwindowsでは修正されているということになる。 シンボリックリンクを辿って、その上の「論理的ではない、物理的上位ディレクトリ」を辿る必要がある使い方なんて無いはず。 なお上記man of tcshのsymlinksの最後の > > cd ".."; echo $cwd > /tmp/from > > /bin/echo .. > /tmp/to ←これがよく分からん、/tmpではなくて?あるいはコマンドが .. ではなく /bin/echo . なら納得だが > > /bin/echo ".." > .. 分かれば出来れば解説よろしく。 WindowsがーではなくCygwinの問題でしょ WindowsはWindowsの仕様でやってる。それがなんであれ正しい仕様 Cygwinがエミュレート機能をすべて行ってる 問題があるならそれはCygwinの問題 WSLならその問題も解決してるだろうさ >>620 それは違う。 Cygwinはエミュレーションレイヤーを提供しており、つまりUnixのシステムコールを受け付けているだけ。 だから仕様としてUnixと同じ動作になる。 詳しくはWikiなり本家なり読めばいい。 問題はUnixの糞仕様が今も修正されずそのままbash等で誤魔化され続け、 windowsでは修正された?為に動作が異なっている事による。 ただこれをCygwinで修正することは出来ないし、するべき事柄でもない。 > Cygwinはエミュレーションレイヤーを提供しており、つまりUnixのシステムコールを受け付けているだけ。 ただしい ? だから仕様としてUnixと同じ動作になる。 ○ 仕様としてUnixと同じ動作になるように目指すべきだが、できてない なんか文字化けする方法のバツを記録してるな。これでいいか? × だから仕様としてUnixと同じ動作になる。 ○ 仕様としてUnixと同じ動作になるように目指すべきだが、できてない >>620 なおWSLは理屈上はUnixの動作になるはず。 ただしbash等を見る限り既知の問題だから対策出来そうではあるが、 バイナリ互換なので現実的に無理だと思う。 (もちろんwindows専用bashを用意すればいいが、それだと既存のシェルスクリプトが動かなくなる。 といってもそれで問題が発生するような奴はWSLなんて使わずDockerだと思うが) が、まあ、俺に関して言えば、 問題の詳細は判明し、特段問題ないから当面はCygwinを使う。 (すまんがNGに当たっているようなのでバラバラにして投稿する) (すまんがNGに当たっているようなのでバラバラにして投稿する) >>623 > ○ 仕様としてUnixと同じ動作になるように目指すべきだが、できてない 違う。そこを目指してない。 CygwinはUnixのシステムコールをcygwin1.dllが受け付けることにより、 GNU等が書き溜めた膨大なUnix向けCソースをそのまま動作させることを目標としている。 結果、ありとあらゆるUnixのツールがcygwin上では動くので、大成功している。 >>623 続き windowsのCMD。EXEのエミュレーションなんて必要ないし、目指してもいない。 本家でも読め。 そして認識も間違っている。CygwinはUnixと同じ動作になってる。つまり、「できてる」 >>619 ・tcshのmanは間違っているだけだと思う。実際試したら想定通り/tmpになった。 ・シェルが勝手に置き換えるべきではないというのは、単にgrep ..とかの動作が今までと変わって直感的でなくなるあたりの問題。.や..の置き換えの仕様とエスケープやクォートの仕様を十分理解すればまあそんなに困らないとは感じる。 >>627 おおサンクス、手元にこなれた環境がないので助かる。 しかし今更このレベルの誤字ってあるかね? まあtcshなんて今時誰も使ってないが、他のマニュアルもそうなってるし。 https://linux.die.net/man/1/tcsh とはいえ実行結果がそうなのならそれが一番信憑性があるが。 Unixは今更直せないで行くのだろうけど、WSLの際にMS内部ではどうするか検討してるだろうね。 WSL推しの人はどうぞ動作報告よろしく。 このところ、MSYS2 の pacman を実行するとエラーが出るな サーバー不調なん?それとも pacman がバグった? 一度アンインストールして最初から入れなおしてもダメやった・・・ いつの間にか直ってた やっぱり、サーバーが不調なだけだったのか・・・ 回線があまりに遅いと向こうからお断りしてくるのでは 今更 pacmanでfork errorでまくったので見切った。 wslでLinux入れてmingw64クロスコンパイルしている。 wslのコンソールでwindowsバイナリもそのまま動くし良い。 cygwinやmsysみたいにcygwin, msysバイナリとwindowsバイナリが混在することの混乱もないしさらに良い pacmanでfork errorの一番の解決策は ちゃんと出てきたメッセージを読むこと これに尽きる 638がそうなのかは知らんが WSLで使うディストリビューション(ArchとかUbuntuとか)によるでしょう 共通して言えるのはLinuxではセキュリティ修正の取り込みは早い WSL は色々なディストリビューションが選べるんですね インストールしようと思ったら、このサイト3年近く更新が止まってる・・・ http://xhmikosr.1f0.de/tools/msys/ 今入れるならどうしたらいい? WSLがある以上、MSYSのメンテはもう廃れるだろうな。 意味ねーし。 cygwinはXのためだけに存在する マジかよシグウィン窓から投げ捨てた WSL派になります DLLだけで動くのが便利なときもあるが、日々の生活はWSLだね Windows 10, WSL, Ubuntu 18.04 で、 VSCode の拡張機能、Remote WSL も使う Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、 ruby 2.6.6, node 12.16.2 を入れた yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。 これは、#!/bin/sh で始まるシェルスクリプト anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える。 ~/.bashrc に、下の2行を追加するだけで、各言語ごとに追加しないでも良い export PATH="$HOME/.anyenv/bin:$PATH" eval "$(anyenv init -)" MSYS+MinGW、仮想マシン+Linuxって感じでWSLの入る余地がない WSL+MinGWツールチェーンにすれば仮想マシンすら必要ないって考えもあるけど やっぱり仮想マシンは手放せないからWindows側はMSYSでいいやってなる read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる