cygwin + mingwn + gcc 相談室 Part2
■ このスレッドは過去ログ倉庫に格納されています
0001980
2005/09/07(水) 23:29:07※ MinGWが正式名称です。スレタイはバグでもtypoでもなく仕様です。
過去スレ:
cygwin + mingwn + gcc 相談室
http://pc8.2ch.net/test/read.cgi/tech/1058134693/
関連サイト:
Cygwin http://www.cygwin.com/
MinGW http://www.mingw.org/
関連スレッド:
GCCについて Part6
http://pc8.2ch.net/test/read.cgi/tech/1121146723/
MinGWを使おう
http://pc8.2ch.net/test/read.cgi/tech/1042611308/
0159デフォルトの名無しさん
2005/11/29(火) 20:43:57Patameterlessって何だ
0160デフォルトの名無しさん
2005/11/29(火) 20:55:04コピペしろ。でないとお互いのためにならん。
>>158の内容に関してはコレ。
ttp://kobesearch.cpan.org/htdocs/perl/IO.pm.html#deprecated
0161デフォルトの名無しさん
2005/11/30(水) 18:33:05gccってUnicodeリテラル( L"ふーばー" みたいなの)をまともに使えないのでしょうか。
マルチバイト文字のリテラルだと確実にヘンなことになります。
一度 char の配列に入れておいてから mbstowcs で変換するとうまくいくのですが。
これはそういうもんだと思ってあきらめるしかないんですかね?
※上記は gcc 3.4.4 で確認
0162デフォルトの名無しさん
2005/11/30(水) 19:47:01L"\u3075\u30fc\u3070\u30fc"
みたいにUnicodeエスケープして gcc -std=c99 や g++ とかなら多少は動いたかもしれない…
# gcj だと --encoding=Shift_JIS とかで済むのだが…
0163161
2005/11/30(水) 20:47:47ありがとうございます。
> L"\u3075\u30fc\u3070\u30fc"
> みたいにUnicodeエスケープして gcc -std=c99 や g++ とかなら多少は動いたかもしれない…
gcc と g++ の両方で試してみましたが、文字列の末尾の文字が化けてしまうようです。
これでうまくいくならフィルタ書こうかとか思ったのですが…
あきらめて MBCS で書くことにします。
0164デフォルトの名無しさん
2005/11/30(水) 21:45:56>>147-151あたりでも触れてるが、gccはASCIIをUTFにするのと同じやり方
(つまり1バイト毎の頭に\0を付ける)でマルチバイトリテラルも処理してしまうので、
L"〜"はマルチバイト環境では使い物にならない。
VC++あたりは元々マルチバイト対応してるから普通に使えるんだけどね。
0165161
2005/11/30(水) 22:10:21あ、すぐ上でガイシュツだったんですね。すみません。
VC++ では _UNCODE を define して L"〜" (実際は _T("〜") ) で書くのに
慣れているので、いまさら MBCS でやりたくないとか思いましたが、仕方ないですね。
0166デフォルトの名無しさん
2005/12/01(木) 09:10:33とりあえず cygwin で
g++ -finput-charset=cp932 -fexec-charset=UCS-2
とかしてみたけど、 windows.h の extern "C++" がコンパイルできなくてテストできない。
0167161
2005/12/01(木) 13:03:32それはすでに試していましたが、どうにもなりません (もちろん、C で書けばコンパイルできます)。
-fexec-charset=UTF-16 でも同様です。
どの方法を使っても化けかたが同じなので、いかなる場合でも
>>164 さんが書かれている妙な処理方法は変わらないようです。
関係ないですが、ソースのコードページがどうであれ、内部的には UTF-8 で持ってるっぽいですね。
仕方ないのでこんなことしてみました。
class _T {
wchar_t *m_p;
public:
_T(const char *p) { int len = ::strlen(p) + 1; m_p = new wchar_t[len]; ::mbstowcs(m_p, p, len); }
~_T() { delete[] m_p; }
operator wchar_t*() const { return m_p; }
};
::_wperror(_T("ふーばー"));
バッファを余分に取りすぎる場合がありますが、短く書きたかったので。
0168168
2005/12/01(木) 16:41:37cygwinを使用していて/bin/以下で
「ls -al」と打つと、
「drwxrwxrwx+」
という文字が出てきますが、
最後の「+」ってなんですか?
0169デフォルトの名無しさん
2005/12/01(木) 17:08:20マルチバイト文字のリテラルの処理はgccはちゃんとやってるみたいですが...
0170デフォルトの名無しさん
2005/12/01(木) 17:27:56スレ違い。
'+'はディレクトリに対して、その他の属性が指定されていると見なせることを示す。
どうやらcygwinの場合はNTFSの場合に'+'がつくようだ。
0171デフォルトの名無しさん
2005/12/01(木) 18:34:41マルチバイト文字は別に問題ない。
今話題にしてるのはUnicodeリテラルの問題。
0172デフォルトの名無しさん
2005/12/01(木) 21:25:56iconv.hが見つからないというエラーメッセージが出るようになってしまいました。
gcc -H test.c で見てみると、インクルード先がmingwに変わっているので
mingw用にiconvをインストールすればいいんだろうことはわかりますが、
それってどこで拾ってこればいいのですか?
0173デフォルトの名無しさん
2005/12/01(木) 21:41:25ソース拾ってきてmingw32用にコンパイルすればいいが…
面倒なら
ttp://cefiro.homelinux.org/resources/files/libiconv/
とかに落ちてるのを拾って使えばいい.
0174デフォルトの名無しさん
2005/12/01(木) 23:49:51助言助かりました。おかげで問題なくリンクまで出来ることを確認しました。
0175デフォルトの名無しさん
2005/12/01(木) 23:57:040176デフォルトの名無しさん
2005/12/02(金) 01:38:150177デフォルトの名無しさん
2005/12/02(金) 01:47:51単に計算させるなら同じで差がでるのはAPI.
cygwinがエミュレーションしてるPOSIXなAPIを使った場合同等の処理をWin32 nativeなAPI
を使うのよりほとんどの場合遅くなる.どのくらい遅くなるかは使うAPI次第なので一概に
どのくらい速度差がでるとは言えない.
0178デフォルトの名無しさん
2005/12/03(土) 23:43:52バージョンの古いGCCで静的ライブラリ(lib***.a)を作ります。
より新しいGCCを使用してコードを書き、このライブラリとリンクすることを考えます。
GCCバージョン間のライブラリ形式の互換性によって、リンクができる場合と
そうでない場合があるらしいですが、それは、どこを調べればわかるでしょうか?
「GCC リンカ 後方互換性 ライブラリ
static library compatibility gcc version backward」 などで子一時間ぐぐってみましたが、
さっぱりわかりませんでした orz
よろしくお願いします。
0179デフォルトの名無しさん
2005/12/03(土) 23:53:25ABI GCC
0180デフォルトの名無しさん
2005/12/04(日) 00:53:55g++は3の近辺に断絶があったと思ったけど。
前スレか、gcc関連のどっかのスレで読んだ覚えが。
0182デフォルトの名無しさん
2005/12/05(月) 08:35:33/━━━━━━━━━ \
|┃| ̄ ̄|. 〇 〇 [大月]┃|
|┃| ̄ ̄|| ̄ ̄ ̄ ̄ ̄ ̄|┃| プオーン!!!
|┃|__||______|┃|
|┃ JR ┃|
|┗━━━━━━━━━┛| \('A`)/ ミ gccのコンパイル マンドクセ
| ━━ ━━ ━━. | ( ) ミ
| [中央.特快] | └└ミ
| \_/ .|
| 〇 ━━━ 〇 |
|___________|
│ │[=.=]| |
└─────────┘
0183デフォルトの名無しさん
2005/12/06(火) 15:54:35の取得はどうやればいいのでしょうか?
0184デフォルトの名無しさん
2005/12/06(火) 16:17:080185デフォルトの名無しさん
2005/12/06(火) 23:34:22WindowsMessageを扱いたいって意味なら、/dev/windows使うといいかも。使い方は
ttp://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20020827#p03
とか参考になるかと。
0186デフォルトの名無しさん
2005/12/08(木) 01:22:37ありがとうございます。キーボードを鍵盤に見立てた電子オルガンを作れ
という学校の課題がありまして、ノートのオンオフにキーボードイベントが
使えないかと思ったんです。
getch()だとオンは取れてもオフの取り方がわからなかったので質問した
しだいです。
今はGLUTのキーボード関連のコールバック関数を使っています。
0187147
2005/12/11(日) 13:17:07-finput-charset=cp932 -fexec-charset=cp932
でやっと通った・・・。ちゃんと内部的にもUTF16になってるし。
亀レスだけど、161さんは、-fexec-charset=cp932で通るんじゃないかな?
0188147
2005/12/11(日) 13:19:26char mbs[] = "表示\0";
short *mbs_l = (short *)mbs;
int i;
setlocale(LC_ALL, "Japanese_Japan.932");
wprintf(L"%s\n", ws);
printf("%s\n",mbs);
for(i=0;ws[i] != L'\0'; printf("%hx ", ws[i++]));
printf("\n");
for(i=0;*(mbs_l+i) != 0; printf("%hx ", *(mbs_l+i++)));
return 0;
結果
表示
表示
8868 793a
5c95 a68e
0189デフォルトの名無しさん
2005/12/11(日) 15:12:25リテラルも実は実装されていたのか。乙 >187
0190デフォルトの名無しさん
2005/12/11(日) 15:40:44なるほど…
gcc はどのバージョンでしょうか?
0192デフォルトの名無しさん
2005/12/11(日) 16:05:26187 じゃないけどね。
手元の cygwin g++ 3.4.4 では -finput-charset=cp932 -fexec-charset=cp932 で
まともに動いてるみたい。
>161 で言う「ヘンなこと」と、
>187 のオプションをつけても「通りません」っていうのを
もうちょっと具体的に書いてみると、何かわかるかも。
0193161
2005/12/11(日) 16:36:06----
std::setlocale(LC_ALL, "Japanese_Japan.932");
wchar_t ws[] = L"表示";
::_wperror(ws);
::_wperror(L"表示");
std::wprintf(L"%s\n", ws);
std::wprintf(L"%s\n", L"表示");
----
-mno-cygwin -finput-charset=cp932 -fexec-charset=cp932 -fshort-wchar -D_WIN32_WINNT=0x0500 -D_UNICODE -DUNICODE -D_GLIBCXX_USE_WCHAR_T=1
でコンパイル
結果
----
表=: No error
表: No error
表示
表示
----
0194161
2005/12/11(日) 16:42:12テストした限りではどんな文字列でも上記のように末尾が欠けます。
また同様に、wprintf ではどんな文字列でも問題ないようです。
_wperror は MSVCRT 固有なので引き渡しがうまくいっていないのかもしれません。
でも -mno-cygwin ですから、wprintf も MSVCRT 由来だと思うのですが…
0195147
2005/12/11(日) 18:54:57でも、wprintfで表示できてるんだから、MBS定数->WS定数展開は出来てると思う。
単純にwperrorのせいかと。
>>149
これまた亀レスですが、wstring自体は使えますよ?
wcoutがワイド文字対応のC関数が足りていないため使えないというだけで。
int main(){
std::setlocale(LC_ALL, "Japanese_Japan.932");
wstring str = L"wstringテスト";
wprintf(L"%s",str.c_str());
}
0196161
2005/12/11(日) 23:50:39> 単純にwperrorのせいかと。
あれからしばらくいろいろ試してみて、そんな気がしてきたところです(w
MBCS → mbcstowcs による変換 → _wperror に与える
でも同じ(まずい)状態になりました。末尾に文字列を連結する部分がうまくないのでしょう。
MBCS で言えばシングルバイト文字である文字だけで構成されている場合のみ問題が起きません。
他の非標準関数ではいまのところ問題を発見できていませんが、
MSVCRT 由来のものや Windows API では、なにか問題が起きることがあるかもしれません。
しかしgccのせいではないでしょう。
以前から -finput-charset=cp932 -fexec-charset=cp932 でのテストも
行っていたのですが、大半は _wperror を使っていたのが災いしました。
おかげで助かりました。どうもありがとう。
0197デフォルトの名無しさん
2005/12/12(月) 23:16:290198デフォルトの名無しさん
2005/12/15(木) 13:07:49を使っているのですが
template <typename T> struct NumericTypeInfo {};
template <> struct NumericTypeInfo<int> { typedef long LongerType; typedef short ShorterType; };
template <> struct NumericTypeInfo<short> { typedef int LongerType; typedef char ShorterType; };
template <> struct NumericTypeInfo<long> { typedef long long LongerType; typedef int ShorterType; };
template <typename T>
T TestFunc(T val)
{
#if 0
NumericTypeInfo<int>::LongerType tmp = val; // これは大丈夫
#else
NumericTypeInfo<T>::LongerType tmp = val; // コンパイルエラーになる...
#endif
tmp << 8;
tmp >> 8;
return tmp;
}
これでコンパイルエラーになります。コンパイラのバグでしょうか?
0199デフォルトの名無しさん
2005/12/15(木) 13:47:27-NumericTypeInfo<T>::LongerType tmp = val; // コンパイルエラーになる...
+typename NumericTypeInfo<T>::LongerType tmp = val; // コンパイルエラーになる...
0201デフォルトの名無しさん
2005/12/21(水) 11:32:16新たにJavaを勉強しようと思い、gcjを入れてみたのですが
gcj -C Sample.java
java Sample
としても動きません。Hellow World!を表示させたいのですが・・・
0202ペンギン
2005/12/21(水) 13:34:05giving up.
xinit: Connection refused (errno 111): unable to c
xinit: No such process (errno 3): Server error.
以上のエラーメセージの回避策、ご教授御願い致します。
0203デフォルトの名無しさん
2005/12/21(水) 19:41:29うちでは動きました。
Mingw GCC 3.4.2, VMはSunの1.5
0204デフォルトの名無しさん
2005/12/21(水) 23:24:31>>203
SunのVM使うならわざわざgcj使う意味ねえだろ…
javac や jikes 使っとけよ…
0205201
2005/12/21(水) 23:44:01ありがとうございます
javac Sample.java
でやるとコマンドは認識されていませんと出るので
色々ぐぐって、gcjコマンドで試しにやってみたところ
コンパイルはできるのですが
java Sample
で実行すると
Exception in thread "main" java.lang.NoClassDefFoundError: Sample
と出て実行できません。.classファイルは出来ているのに・・・
0206デフォルトの名無しさん
2005/12/21(水) 23:50:02mainクラスの指定が必要だった気がする。
--main=クラス名
こんな感じで。
0207デフォルトの名無しさん
2005/12/22(木) 00:14:41javac を使えってのは Sun の JDK をインストールしてそこに入ってるjavacを使えってことだ…
この場合 gcj は必要ない.JDKのインストールや設定が載ってる解説本でも買って読め.
gcj を使って Sample.java をexeにして実行したいっていうなら
gcj --main=Sample -o Sample.exe Sample.java
って感じでコンパイル.できたら
./Sampple.exe
ってやって実行する.
0209デフォルトの名無しさん
2005/12/23(金) 22:01:49それを言ったらスレタイからするとcygwinのsetup.exeでインストールされるMinGW環境のGCCの話しか出来なくなる希ガス。
javac使うなら
ttp://www.02.246.ne.jp/~torutk/javaoncygwin/javaoncygwin.html
見れ。
まあJDK+NetBeans入れた方が手っ取り早いと思うが。
0210デフォルトの名無しさん
2005/12/24(土) 17:14:17ほかの主な機能は使えるのに、「Ctrl-X Ctrl-C」でファイルを終了させる
機能だけうまくできません。どうしたらいんでしょう?
0211デフォルトの名無しさん
2005/12/24(土) 18:41:18今までわざわざ自前のフィルター通してコンパイルしてたよorz
0212デフォルトの名無しさん
2005/12/24(土) 19:04:17set CYGWIN=tty
0213210
2005/12/24(土) 20:28:32解決しました。ありがとうございます。
0214デフォルトの名無しさん
2005/12/30(金) 22:26:58#include <stdexcept> などの
ヘッダファイルをどこから読んでいるんでしょうか?
/usr/include/c++/3.4/stdexcept
とか見あたらないのですが・・・
0215デフォルトの名無しさん
2005/12/30(金) 22:28:570216デフォルトの名無しさん
2005/12/30(金) 22:33:17に見つかりました。/usr 以下しか find してませんでした。
0217デフォルトの名無しさん
2005/12/30(金) 22:34:500218デフォルトの名無しさん
2005/12/30(金) 22:37:06hellow world!ってどんな世界か
ぜひとも見てみたいので今度連れて行ってください。
0219デフォルトの名無しさん
2005/12/30(金) 22:55:320220デフォルトの名無しさん
2005/12/30(金) 23:08:04オオ!ジャパンノ コトデスカ〜!
ツレテッテ クダサ〜イ!!!
0221デフォルトの名無しさん
2005/12/30(金) 23:16:49いないような気がするんですが・・・・
Visual C++ でコンパイルするときと切り替えるために、
_MSC_VER と __GCC__ を見ているのですが、
それじゃだめなんでしょうか・・・
0222デフォルトの名無しさん
2005/12/30(金) 23:47:40__GNUC__
0223デフォルトの名無しさん
2005/12/31(土) 00:00:07今 g++ -c -E -dD test.c ってやってみて確認しました。
__GNUG__ なんてものもあるんですね。
つーか、俺、なんで __GCC__ だって思いこんでたんだろ。
あと、この手のマクロって specs に書かれてるものもあるし
そうでないものもあるんですね。
0224__GNUG__
2005/12/31(土) 00:01:36Testing it is equivalent to testing
(__GNUC__ && __cplusplus).
0225デフォルトの名無しさん
2005/12/31(土) 16:08:33インストール方法が分かりません。
誰かご教授下さい。お願いします。
0226デフォルトの名無しさん
2005/12/31(土) 16:58:320227デフォルトの名無しさん
2005/12/31(土) 22:56:160228225
2006/01/02(月) 16:55:06>Colon expected
>Command syntax error
と出ました。
0229デフォルトの名無しさん
2006/01/02(月) 17:22:020230デフォルトの名無しさん
2006/01/03(火) 17:57:51げ、あっちとのマルチか。
一応言っとくと、ntl-5.4で試したが、doc/config.txt にやり方がちゃんと書いてある。
この手順でntl.aが生成できたし、make checkも動いたぞ。
0231225
2006/01/03(火) 20:59:190232デフォルトの名無しさん
2006/01/04(水) 00:19:14なんだ、225はマルチだったのか
0233デフォルトの名無しさん
2006/01/05(木) 09:16:32Main.c:123: error...
のようなフォーマットなんですが、これを
D:\AVR\Project1\Main.c(123) : error...
のようなフォーマットで吐き出させるようにできませんかね?
標準エラー出力を捕捉して sed などで書き換えるしかないのでしょうか?
0234デフォルトの名無しさん
2006/01/05(木) 09:43:37コンパイルするときの入力にフルパス入れれば、
と思ったけど、行番号のフォーマットまで変えるのか。
置換しる。
0235デフォルトの名無しさん
2006/01/05(木) 14:36:140236デフォルトの名無しさん
2006/01/05(木) 16:42:320237デフォルトの名無しさん
2006/01/08(日) 11:17:13リンカに _inet_lnaof がないと怒られてしまいました。
何が問題なんでしょうか……
gccのバージョンは3.4.4-1
glib-develのバージョンは1.2.10-3
を利用しています。
#include <stdio.h>
#include <arpa/inet.h>
int main() {
struct in_addr addr;
inet_aton("192.168.0.1", &addr);
inet_lnaof(addr);
}
0238デフォルトの名無しさん
2006/01/08(日) 12:08:520239デフォルトの名無しさん
2006/01/08(日) 12:55:45あっちゃこっちゃで言及されてるよ。
0240デフォルトの名無しさん
2006/01/08(日) 20:00:30def ファイルの書き方がわかりません。
(MinGW(mingw-jp-20040224), UNLHA32.DLL(Ver 1.91g))
<やったこと>
(1) def 作成。
>pexports UNLHA32.DLL > unlha32.def
(2) ライブラリ作成。
>dlltool --def unlha32.def --dllname UNLHA32.DLL --output-lib libunlha32.a
(3) コンパイル。
>g++ -c test.cpp
>g++ test.o -o test -L. -lunlha32
ちなみにソースはこのような感じ
void foo(void)
{
HARC harc = UnlhaOpenArchive(0, "test.lzh", 0);
UnlhaCloseArchive(harc);
}
ここでエラーになります。
test.o(.text+0x21):test.cpp: undefined reference to `UnlhaOpenArchive@12'
test.o(.text+0x9c):test.cpp: undefined reference to `UnlhaCloseArchive@4'
0241240
2006/01/08(日) 20:01:00そこで、def ファイルに問題があると思い、
(4) unlha32.def を書き換え
UnlhaCloseArchive
UnlhaOpenArchive
を以下のように修正↓
UnlhaCloseArchive@4
UnlhaOpenArchive@12
で再度 (2)(3) を行ったところ、今度はコンパイルが通りました。
しかし実行してみると、
test.exe - エントリ ポイントが見つかりません
プロシージャ エントリ ポイント UnlhaCloseArchive@4 が
ダイナミック リンク ライブラリ UNLHA32.DLL から見つかりませんでした。
というメッセージが出て終了してしまいます。
def の書き方が良くないのでしょうか?
(長くてごめんなさい)
0242デフォルトの名無しさん
2006/01/08(日) 20:27:04extern "C" しないとまずいんとちゃう?名前マングリングされるから。
0244デフォルトの名無しさん
2006/01/08(日) 21:29:470247デフォルトの名無しさん
2006/01/09(月) 03:35:24ありがとうございます
ヒントをいただいて、libc.aをobjdumpしたらinet_lnaofがありませんでした
cygwinは捨てることにします
0248デフォルトの名無しさん
2006/01/13(金) 11:47:43cygwin1.dllを使わないように-mno-cygwinつけるとnet関係を中心にコンパイルが通らなくなるけど、
これって要は、その辺(net関係)の関数の実体がcygwin1.dllに入っているってことなのかな?
それと、GPLに準拠(つーかオープンソースライセンスか)するならcygwin1.dllを
配布(或いは利用者に拾ってもらう)してもよいと考えていいのかな?
0249デフォルトの名無しさん
2006/01/13(金) 19:38:530250デフォルトの名無しさん
2006/01/13(金) 20:18:410251デフォルトの名無しさん
2006/01/13(金) 22:45:090252デフォルトの名無しさん
2006/01/14(土) 07:46:420253デフォルトの名無しさん
2006/01/14(土) 22:56:07つか、RC ばっかりで正式版が出てこない最近の MinGW っていったい。。。
0254デフォルトの名無しさん
2006/01/14(土) 22:56:380255デフォルトの名無しさん
2006/01/19(木) 01:20:24内容は
/* MyC.c */
#include <stdio.h>
int main(void) {
printf("My C Program\");
return 0;
}
という簡単なものなのですが
これをgccでコンパイルしようとしたところ
No include path in which to find stdio.hと表示されてしまいます。
どうすればコンパイルできるようになるのでしょうか?
0256デフォルトの名無しさん
2006/01/19(木) 01:38:58まずはコンパイルするためのコマンドラインを確認。
それだけのプログラムなら
gcc MyC.c -o MyC.exe
で MyC.exe が出来上がるはず。
それでもダメなら、
gcc -v -fsyntax-only MyC.c
とかやって、正しくインストールされているか調べて対応する。
0257デフォルトの名無しさん
2006/01/19(木) 03:54:390258デフォルトの名無しさん
2006/01/19(木) 06:27:53■ このスレッドは過去ログ倉庫に格納されています