gcc@MinGWで外部コマンドの起動に問題がある

このQ&Aのポイント
  • MSYS2/MinGW64 on Windows10 の環境で gcc 開発をしています。gcc@MinGWで外部コマンドを起動する際に問題が発生しています。
  • /usr/bin/ls コマンドを使って外部コマンドを起動しようとすると、存在しないというエラーメッセージが表示されます。
  • 問題が発生する理由や、同じソースを /usr/bin/gcc でコンパイルすると正常に動作する理由について詳しい情報を求めています。
回答を見る
  • ベストアンサー

gcc@MinGW:外部コマンドの起動

MSYS2/MinGW64 on Windows10 の環境で gcc 開発をしています。 下記の簡単なソースを用意します。 #include <stdio.h> #include <stdlib.h> void main() { system("/usr/bin/ls"); exit(0); } なお、/usr/bin/ls の存在は、   $ which ls ↓   /usr/bin/ls にて確認しています。 これを /mingw64/bin/gcc でコンパイルして実行すると、 '/usr/bin/ls' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示され、明らかに存在するはずの ls コマンドが起動されません(上記エラーメッセージ中のマルチバイト文字はなぜか cp932 で表示されています)。 ところが、同じソースを /usr/bin/gcc でコンパイルすると、問題なく実行されるのです。 MSYS2 と MinGW の関係がよく理解できていないこともあり、どうしてこのようなことが起こるのか理解に苦しんでいます。 どなたかお心当りのあるかた、お教え下されば幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.1

>明らかに存在するはずの ls コマンドが起動されません 「明らかに存在するはず」と書かれていますが、 MSYS2環境のbashで確認されたのではないでしょうか。 エラーメッセージの >/usr/bin/ls' は、内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 はcmd.exeが出力してるメッセージに思えます。 cmd.exeで'/usr/bin/ls'は起動できないのではありませんか? /usr/bin/gccでコンパイルした場合と/mingw64/bin/gccでコンパイルした場合で動作が異なるのは使用しているライブラリが異なりsystem関数の実装が異なるのではないでしょうか。

yshwaki
質問者

お礼

回答ありがとうございます。 どうも、ご指摘のとおりのような気がします。 試しに cmd.exe から /usr/bin/ls を叩くと、当該現象と全く同じメッセージが表示されます。 cmd.exe が表示しているメッセージなら cp932 コードであるのもうなずけます。 cmd.exe 環境下で /usr/bin/ls が存在しないのは当たり前ですが、MinGW の gcc でビルドしたときの system 関数は外部シェルとして Windows の cmd.exe を利用する、ということは全く想定外でした。 MinGW でビルドされた実行形式ファイルは、MSYS や MinGW がインストールされていない Windows 環境でも実行できるように設計されている、ことによるのですね。

関連するQ&A

  • bccは分かりましたがgccが使えません

    Cのソースの#include <stdio.h>でエラーになります。 gccではbccのbcc32.cfgで行うような設定はどのようにすればよいですか? MINGWのコンソールで $ echo $C_INCLUDE_PATH c:/msys/1.0/mingw/include;c:/msys/1.0/mingw/lib/gcc/mingw32/3.4.5/include このように出ます。 $ gcc myapp.c で#include <stdio.h>の行でコンパイルエラーです。 MINGWでは$C_INCLUDE_PATHを正しく設定できているみたいですが、gcc.exeにそれが伝わっていないみたいです。 AUTOEXEC.BATには何も追記したくないので何も追記していません。 どうすればライブラリのパスを通せますか?

  • WindowsXPの MinGW,コマンドラインからのgccについて

    WindowsXPの MinGW,コマンドラインからのgccについて コンパイルエラーのログのテキストファイルへの取得方法をご教授ください。

  • 'gcc' は、内部コマンドまたは外部コマンド、

    いつも大変お世話になりありがとうございます。 C言語を勉強することにしました。 C:¥C>gcc Sample1.c -o Sample1 'gcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 色々手を尽くしたのですがコンパイルエラ-になります。 http://windows.blogo.jp/programming/mingw_compile を拝見しまして、絶対にその通りにやっているのですが 上記のようなコンパイルエラーになります。 環境変数も間違ってないはずです。 因みにコードは下記です。 #include <stdio.h> int main(void) { printf("ようこそC言語へ!\n"); return 0; } ご多忙中恐れ入ります。 アドバイスのほど宜しくお願い申し上げます。

  • MinGWのgccでOpenMPを使う方法

    MinGWのgccでOpenMPを使いたいのですが、サンプルソースコードを以下のようにコンパイルするところでエラーとなります。 gcc -fopenmp -O2 abc.c その結果が以下のようです。 ld.exe: cannot find -lpthread pthreadがみつからないのですが、あるけど見つからないのではなく、もともとない、が正解のようです。MinGWをインストールする際、ものすごく多くのファイル選択の可能性があり、デフォルトでやると欠落してしまうんだと思います。インストールのセレクトの仕方を教えて頂ければと思います。検討がつかないぐらいセレクションのリストが長々としているので。あるいは別の解決方法でも。よろしくお願いします。

  • Mingwで扱うソースコードの文字コードについて

    Mingwでプログラムを作っているのですが、使用する文字コードについてご意見を伺いたくて質問いたします。 コレ!という解がないかもしれない質問なので、色々ご意見をいただければと思います。 よって、全く急ぎの質問ではありません。 1~2週間で解決できればいいな~というのんびりした質問です。 現在、Win7 32bit 環境で、C言語メインで開発しており、Mingwは2017年5月頃に入手したものをそのまま使っております。 バージョンは、 gcc version 6.3.0 (i686-posix-dwarf-rev2, Built by MinGW-W64 project) GNU gdb (GDB) 7.11.1 GNU ld (GNU Binutils) 2.27 iconv (GNU libiconv 1.9) GNU Make 3.81 等となっており、相当古いものです。現在のままでもさほど支障はないのですが、gccにいたっては既にナンバーが2遅れであり、そろそろバージョンアップしようと久しぶりにmingw-get-setup.exeを立ち上げました。 念のため旧バージョンのディレクトリ名を変えて上書きしないようにし、インストール完了しました。 そして、いつものようにmake経由でコンパイルコマンドを入力するとiconv関連でエラーが発生します。 cc1.exe: error: no iconv implementation, cannot convert from cp932 to UTF-8 make: *** [b-102.obj] Error 1 b-102.objというのがmainを含んだoファイルです(MakeファイルをborlandやVC++互換にしているため、拡張子がobjになっています) ソースコードの文字コードはSJIS、プログラム全体としては -DUNICODE -D_UNICODE オプションをつけて、文字列リテラルは _T("")マクロを使い、TCHAR型とtchar.hを使って、 UTF16を内部コードにしています。 コンパイルコマンドは gcc -finput-charset=cp932 -std=gnu99 -DUNICODE -D_UNICODE -O3 -Os -Wall -Wuninitialized -s -c -o b-102.obj b-102.c で、旧バージョンのmingwでは問題ないものでした。 ネットで調べてみると、Mingwの文字コード関係はときどきバグや設定ミスが入るとの事でしたので、2019年1月15日からバージョンアップするたびにインストールしてみていますが、2019年1月27日のバージョンに至るまで解決していません。 現在の最新バージョンとしているのは gcc version 8.2.0 (MinGW.org GCC-8.2.0-3) GNU gdb (GDB) 7.6.1 GNU ld (GNU Binutils) 2.31.1 iconv (GNU libiconv 1.14) GNU Make 3.81 であり、gdbのバージョンがなぜか古いこと以外は問題無いように思います。 そこで本題に戻るわけですが、いくつかの解決策からどれを選ぶか迷っています(私の知らない、想定していない解決策があるかもしれません)。 実際に色々やっている開発現場の方のご意見も頂戴したいと思います。 以下、当方で考えている解決策です。一長一短ありそうなので、「その方法は○○が面倒だ」「Mingwではその方法は△△の理由でオススメしない」など教えてください。 なお、現在環境を切り替えるため、コマンドプロンプトを起動する際に、旧バージョンと新バージョンで作業するため以下の環境変数をsetコマンドで一時設定して使っています。 この問題解決のため、新バージョンでは環境変数をいくつか追加設定していますがうまくいきません。 旧バージョン: PATH=C:\mingw32_2017\bin;%PATH% PATH=C:\mingw32_2017\msys\1.0\bin;%PATH% 新バージョン: set MINGW_HOME=C:\MinGW;%MINGW_HOME% set MSYS_HOME=C:\MinGW\msys\1.0;% MSYS_HOME% set C_INCLUDE_PATH=C:\MinGW\include;%C_INCLUDE_PATH% PATH=C:\MinGW\bin;%PATH% PATH=C:\MinGW\msys\1.0\bin;%PATH% 以下、当方の考えている解決策案です。当方にとって望ましい順です。 案1. 環境変数や設定ファイルを書き換えることで、iconvを望みどおりに動作させる。 現在はMINGW_HOME、MSYS_HOME、C_INCLUDE_PATHしか見つけておらず、もしかしたら新たに設定が追加されているかも?。 案2. コンパイルコマンドやリンカコマンドに適切なオプションを設定する? こういったことができるという情報は把握してないのですが、あるといいな、ぐらいです。 案3. ソースコードの文字コードを全てUTF16に置き換える。 かなり面倒ですが、一旦できれば今後は楽かもと思っています。UTF8にしたくないのは、どうせいつかはUTF16になっていくのに、中途半端に1バイト幅から?バイト幅まですごく可変長な文字コードを使いたくないという理由です。内部コードもUTF-16にしているので、ソースの文字コード、扱うファイルの文字コード、内部文字コードを揃えられたら楽です。 ただ、200近いソースコードを_T("")マクロでせっかくユニコード対応させたのに、口惜しくはあります。 また、MingwでUTF16は面倒すぎるという報告も多数見つけているので、不安ではあります。最新バージョンではどうなのでしょうか。 他にも、VC++やClangにも対応できる無難な文字コードを選びたいと思っています。 さらにいずれQtも使ってみたいので、そういった有名な外部ライブラリとの相性をご存知の方はご教授ください。 案4. makeでコンパイル命令を出す際に、自動的にiconvを呼び出して、別ファイルに出力するのではなく、フィルターのように機能させる方法があれば・・・。調べてみましたが、それらしい機能は見つかりませんでした。 案5. ソースコードをUTF8に統一する。 現在わかっている範囲で一番やりたくない方法です。 案6. Mingwのアップデートを待つ。 いまのところ効果無しですが、うまくいく目算があればもうすこし粘ろうと思います。 案7. 上記以外の方法。 当方が知らないだけで、インストール時の隠し設定とかあるかも、という期待を込めて。 現在うまくやってらっしゃる方、開発現場の裏技を知っている方、そのほか「面倒だけどウチはこれで妥協してる」など、いろいろな情報をお待ちしています。 よろしくお願いいたします。

  • 実行可能な外部コマンドは?

    cgiプログラムから外部コマンドを実行させたいのですが,できることとできないことの区別が明確でありません. システムコマンドのlsは実行できず,wc や cp は実行できます. 自作のプログラムはcgiプログラムと同じところある物は動きますが,それを/binや/usr/binに移動させると動かなくなります. これはサーバのセキュリティがそのように設定されているということなのでしょうか?

    • ベストアンサー
    • CGI
  • コマンドプロンプトでコマンドが認識されない

    c初心者なのですが、コマンドプロンプトでコマンドがうまく実行できません。 インストールしたものは、MinGWとmsysです。 環境変数もあまりよくわかっていませんが一応設定しました。 http://www.knatech.info/Dev-mingw-install.html こちらの環境変数の設定を参考に設定しました。 そしてコマンドプロンプトでmakeをうつと make: *** No targets specified and no makefile found. Stop. となり、こちらは認識しているようですが、gccと打つと 'gcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とでてしまいます。 どのようにしたらgccを認識してくれるのでしょうか。 初めてなことだらけで、質問も分かりにくいところがあるかもしれませんがよろしくお願いします。

  • GCCでライブラリが足りない

    はじめまして。 LindowsOS4.0を使っています。 コンパイルができずに困っています。 GCCとMAKEをインストールしました(Lindowsはどちらも入っていないのです。Debian/Woodyベースと言われています)。 gcc 2.95.4 make 3.79.1 which gcc とすると、/usr/bin/gcc と表示されます。 で、./configure すると、 ..... checking whether the C compiler works ... no と表示されコンパイルエラーになります。 configure.log を見ると、 ------------------- checking for gcc configure:916: checking whether the C compiler (gcc ) works configure:932: gcc -o conftest conftest.c 1>&5 /usr/bin/ld: cannot open crt1.o: No such file or directory collect2: ld returned 1 exit status configure: failed program was: #line 927 "configure" #include "confdefs.h" main(){return(0);} --------------------- とか --------------------- checking for gcc configure:905: checking whether the C compiler (gcc ) works configure:921: gcc -o conftest conftest.c 1>&5 /usr/bin/ld: cannot open crt1.o: No such file or directory collect2: ld returned 1 exit status configure: failed program was: #line 916 "configure" #include "confdefs.h" main(){return(0);} ---------------------- とかなっています。 confdefs.hというのは何かのライブラリなのでしょうか?これが無いとconfigureできないのでしょうか?? よろしくお願いいたします。

  • MinGWをXPにインストール後 DOSのipconfig など使えな

    MinGWをXPにインストール後 DOSのipconfig など使えなくなる 標記の通り、昨日MinGWというC言語の環境をインストールした。 それに応じてシステムの環境関数もいくつか追加した。下記: 1 MINGW_PATH=G:\MinGW 2 C_INCLUDE_PATH=%MINGW_PATH%\include;%MINGW_PATH%\lib\gcc\mingw32\3.4.5\include 3 CPLUS_INCLUDE_PATH=%MINGW_PATH%\include\c++\3.4.5;%MINGW_PATH%     \include\c++\3.4.5\mingw32;%MINGW_PATH%\include\c++\3.4.5backward;%C_INCLUDE_PATH% 4 LIBRARY_PATH=%MINGW_PATH%\lib;%MINGW_PATH%\lib\gcc\mingw32\3.4.5 5 PATH=%MINGW_PATH%\bin;%MINGW_PATH%\libexec\gcc\mingw32\3.4.5 そうしてから、DOSでipconfig 出来なくなるだけじゃなく、社内用のメールボクスも開けなくなる。 一体なぜか? どなたか教えていただきませんか

  • H8300-hms-gccでコンパイルできない

    H8マイコンの開発環境(C言語)をcygwinにインストー ルしましたが,h8300-hms-gccでコンパイルできません. ソースファイルが保存されているディレクトリでコンパ イルしてるにもかかわらず,No such file or directry となって,ソースファイルを認識しないのです.一方, 通常のgccではコンパイルできます. echo $PATHで確認しましたが,h8300-hms-gccが保存さ れている/usr/local/binへのパスは通ってます. 何が原因なのか全く分かりません. 宜しくお願いいたします. OSはWindows 2000です.

専門家に質問してみよう