1 :
デフォルトの名無しさん :
03/02/25 22:18
2get!!
親父が死んだ…
4 :
デフォルトの名無しさん :03/02/26 20:40
前スレは 1000 で無限ループになっている…
糞スレ立てるなYO!
6 :
デフォルトの名無しさん :03/02/26 21:09
gccのブートプロセスを説明したドキュメントとかあれば いいんだけど、ないかな?やっぱりMakefileを丹念に読んで いかないとだめかな。
7 :
デフォルトの名無しさん :03/02/26 21:17
bccと具体的には何が違うのですか?
どなたかいっぱいあるcrt*.oの違いを説明していただけないでしょうか。 どうやらコンストラクタ・デストラクタと関連があるようですが…
おお素晴らしい… あなたは神です。参考にさせていただきます。
どこから落としたらいいのかわからない・・・
15 :
デフォルトの名無しさん :03/03/07 06:00
gcc 3.2 で int a, b, c, op; op = 0; __asm__ __volatile__ ( "cpuid;" : "=b"(a), "=d"(b), "=c"(c) : "a"(op) : "%eax", "%ebx", "%ecx", "%edx"); とやると can't find a register in class `AREG' while reloading `asm' といわれてしまいます。どうしてなんでしょう? レジスタ指定を全て省略してやるともちろん動くんですが...
>15 gccの asm書式ってさっぱりわからんよね。 マニュアル読んでもいまいちだし・・・。 まあ、がんばって。
>>15 cpuid は out: eax ebx ecx edx, in: eax だからそれだとまずい。
int a, b, c, d, op;
op = 0;
__asm__ __volatile__("cpuid"
: "=a" (a), "=b" (b), "=c" (c), "=d" (d)
: "0" (op));
でどーでしょ。
>>16 アーキテクチャ依存のことは info にはあんま書いてないから、Machine Desc
の章を読んで config/i386/i386.* とかを見るしかないと思う。
>>17 上記コードでも :"%eax","%ebx","%ecx","%edx"をつけると同じエラーが出ます。
それと "0" (op)ってなんでしょう?"a"(op) じゃなくて?
>>18 > 上記コードでも :"%eax","%ebx","%ecx","%edx"をつけると同じエラーが出ます。
out と clobber に同じレジスタを書けば、そりゃ矛盾してるからエラーになるよ。
> それと "0" (op)ってなんでしょう?"a"(op) じゃなくて?
The constraint `"0"' for operand 1 says that it must occupy the same
location as operand 0. A digit in constraint is allowed only in an
input operand and it must refer to an output operand.
20 :
デフォルトの名無しさん :03/03/09 02:01
#include <iostream> main(){} ↑これだけのコードで実行ファイルが200KBになるんだが、 なにか間違ってないか? ちなみに、#include <iostream>を消しただけで10KBほどに収まる。
>>20 それって、使っているプラットフォームが悪いんじゃないの?
NetBSD-1.6/i386 (gcc-2.95.3) だと、33KB にしかならん。
同じプラットフォーム上で、gcc-3.2.1 にすれば 7KB を切る。
Cygwin + gcc-3.2.0 だと400KBになる。 strip後でやっと200KB。
strip忘れてた。strip したら5108バイトですた。
インラインアセンブラを使わずにスタックポインタを操作する ことってできる?
Cygwinかぁ。MinGWだとどうだろ? 俺、UNIXの人なんだけど、Windows上ではCygwinよりMinGWの方が ずっと好きなんよ。
>>20 >>21 単にデフォがstaticライブラリか共有ライブラリかの違いだと思われ
libstdc++を共有ライブラリにすれ
DLL hellに気をつける
>>25 以下の例はプログラムカウンタ、スタックポインタ、スタックフレームを差し替えています。
コンパイラすら通していないので、動作保証はありません。
jmp_bufの型定義は環境に依存するので、インラインアセンブラを使うのと大差ないかも知れません。
void create_new_task(void *stkbuf, size_t stksize)
{
jmp_buf env;
if(setjmp(env) == 0)
{
/* 新しい実行環境を作成する */
env[0].__jmpbuf[5] = (int)task_startup; /* プログラムカウンタ */
env[0].__jmpbuf[4] = (size_t)stkbuf + stksize; /* スタックポインタ */
env[0].__jmpbuf[3] = (int)NULL; /* スタックフレームポインタ */
/* 新しい実行環境へジャンプ */
longjmp(env, 1);
}
/* この行は実行されない */
assert(0);
}
29 :
デフォルトの名無しさん :03/03/09 16:44
>>28 これやるとジャンプ元の環境やメモリはどうなってしまうんですか?
>>29 そのまま放置。task_startupが終るとcrash。
つーか[0].って書き方は珍しいな。
>>29 即レスすると一日2chに張り付いているように思われそうですが偶然です。
setjmp(env)した時のenvを変更する前に保存しておいてlongjmp(env, 1)してあげれば、
>>28 のコードでassert(0)とされている所の実行を始めます。もちろん、この場合にはスタックは元の領域を使用することになります。
質問の内容とずれていますか?
スタックポインタを操作するという元質問から、non-preemptなマルチスレッドを実現しようとしているように思ったのですが・・・。
>>30 マルチスレッドを実現するならば、task_startup関数は以下のように終了前に別タスクへディスパッチするようにします。
マルチスレッドで無いならば
>>30 氏の指摘通りにクラッシュしてしまいます。
void task_startup(void)
{
int task_ret;
/* ユーザー指示のタスクメイン関数を実行 */
task_ret = (*g_new_task_main)(g_new_task_arg);
/* タスクを終了して別タスクへディスパッチ */
task_exit(task_ret);
/* ここへは到達しない */
assert(0);
}
env[0].という書き方は、私の環境のjmp_bufの型定義によるものです。この辺りは各環境に従ってください。
>>33 その定義だと、元のスレッドがそのまま放置されそうなんだが。
というか、どうせバリバリ環境依存なんだから、エントリポイントとパラメー
タもスタックに突っ込んでtask_startup()に渡すように汁。
> env[0].という書き方は、私の環境のjmp_bufの型定義によるものです。この辺りは各環境に従ってください。
env->ってしないのかなとふと思っただけ。
すいません、正にそういうコードを書いていて、その上での技術的興味 からgccでSP直接操作できる方法もあるかな? という質問です。 やっぱインラインアセンブラしか方法はないのかな。どこかで&_spみた いな表記を見たような気もするんだが。
volatile register void *sp asm ("%esp"); 程度が限度と思われ。
arの使い方とmakeの作り方解説しているサイトってない?
>>39 arはman、makefileはinfoを見るしかないんじゃないかなあ。
あと既存のファイルを気合入れて読むとだんだん書けるように
なる気がする。
>>40 makeの作り方とMakefileの書き方は違うと思うんだよ。
43 :
デフォルトの名無しさん :03/03/15 03:58
拡張アセンブラはgcc2じゃつかえないの?
>>40 antの使い方とmakeのビルド方法を同時に解説してるサイトってあるのだろうか(w
デバッグ情報を利用して呼び出し元関数名→さらに呼び出し元関数名→・・・ を調べたいのですが、gccでこれを行うにはどうしたらよいのでしょうか? ちなみに環境はcygwinです。
>>809 誘導されてきた場合、その旨伝えたほうが良いらしいよ
とりあえず
WM_POWERBROADCAST / PBT_APMSUSPEND
などでサスペンドを検知して対処するとか
誤爆失礼
>>46 -gオプションつけてコンパイルする
そこから先はgccじゃ無理だな
オレなら・・・そうだな、gdbあたりを使う
>>46 `__builtin_return_address (LEVEL)'
This function returns the return address of the current function,
or of one of its callers. The LEVEL argument is number of frames
to scan up the call stack. A value of `0' yields the return
address of the current function, a value of `1' yields the return
address of the caller of the current function, and so forth.
The LEVEL argument must be a constant integer.
これと nlist(3) なんかを使えばできそうだな。
$man nlist No manual entry for nlist (´・ω・`)ショボーン
*BSDはnlist。Linuxはlibbfd。 Debianの場合、libbfdはbinutils-devに。
53 :
デフォルトの名無しさん :03/03/16 06:05
GCCってEmacsみたいにLispを搭載してるってほんと?
54 :
デフォルトの名無しさん :03/03/16 06:24
>>53 何の話をしてるんだ?
Emacsはエディタだろ
そういやGCCの中間コードはLISPみたいなのと聞いたことがあるな。
>>53 RTLでしょ。
gccにオプション -dr を付けてコンパイルすれば、
*.rtlというファイルが出てくる。
昔の(GNU C Compilerだけだった頃の)gccには無くて、
gcc2辺りから入ったんじゃなかったかな。
知る限り最初からある。 古いChangeLogには、1.17の記述があるが既にRTLがある。
58 :
デフォルトの名無しさん :03/03/17 06:47
Cで使えるRTLパーザはありますか? DFGを眺めたいのですが。
ある共有オブジェクトファイル内のコードから投げた例外を別のファイルで キャッチしようとするとterminateしてしまうのですが、これって解決できないのでしょうか。 環境はgcc 3.2.2です。-fexceptionsつけても駄目でした。 JNIから呼びたいので共有オブジェクトを使わざるを得ないのですが、例外が使えなくて 困っとります。
ありがと。遊んでみます。
64 :
デフォルトの名無しさん :03/03/19 06:47
65 :
デフォルトの名無しさん :03/03/19 07:25
関数名に@がついたのを書くと GCC2.9じゃエラーがでないのに GCC3.2じゃエラーがでて困ってるんですがどうしたらいいでしょう?
@使うなよ
#include <iostream> #include <locale> #define LOCALE "ja_JP.eucJP" int main(int argc, char** argv) { std::locale::global(std::locale(LOCALE)); std::wcout << L"Hello,世界" << std::endl; return 0; } とやっても表示されないんですが、バグですか? clocale を include して ::setlocale(LC_ALL, LOCALE) してみても変わりません。
>>67 -Sしてデータ配置を見てみると、L"Hello,世界"がおかしいみたいです。
ファイルの保存をどんなコーディングシステムにしても
>>68 configure に --enable-c-mbchar つけた?
>>69 うへぇ、それかも。サンクス。今からやってみまつ。
ちょっと話はずれますが、UTF-8 なソースを gcc でコンパイルすると 文字列リテラルが UTF-8 になりますね。 つい今しがた発見してちょっと感動しました。 ただし、使い物にならなそうな予感。
うまく行かない.・゚・(ノД`)・゚・. config.status です。 --with-gcc-version-trigger=/home/username/gcc-3.2.2/gcc/version.c \ --host=i686-pc-linux-gnu \ --enable-languages=c,c++ \ --enable-c-mbchar \ --with-system-zlib \ --enable-shared \ --enable-thread=pthread \ --norecursion
73 :
デフォルトの名無しさん :03/03/21 13:30
gccに限らないんですが 大規模ソフトをコンパイルした後 メモリの使用量が100M近く開放されてないのは 「mallocが常に成功するとはかぎらない」 っていう奴と関係あるんですか?
>>73 何を見れば、
「コンパイルした後メモリの使用量が100M近く開放されてない」
と判断できるんだ?
ヘッダ等が(何だか知らないが)システムのメモリ上のキャッシュに残っているとか
相変わらず動かないです…(´・ω・`)ショボーン。ちょっと進展がありました。 #include <stdio.h> #include <locale.h> int main(int argc, char** argv) { setlocale(LC_ALL, "ja_JP.eucJP"); fputws(L"こんにちわ、世界", stdout); return 0; } これだとキチンと表示されます(ていうか、先に試せよ俺)。 libstdc++のビルドがうまくいってないようです。うーむ…。 gcc -v は ../gcc-3.2.2/configure --enable-c-mbchar --enable-languages=c,c++ --enable-thread=pthread
gccのL""は役立たずだよ。
>>79 そうだったのか!!(AA略。
C言語では問題無く使えてるようだし、C++ の方は ICU でも入れます…。さんくす。
所詮1バイト圏の連中が作ったコンパイラだから、C++標準で ロケールがサポートされたと言っても実際にはなかなか 組み込んでくれないんだね。
つーかリテラルはgettextizeするのが正解。
>>82 リテラルとは限らないんじゃないか?
wostream がまともに動いてない状況じゃー wchar_t 周りは全滅だろう。
gettext 使ったからって解決するとは思えない。
gccは最適化は-O3まで有効だと思ってたんですが このまえ-O7してるメイクファイル見かけたんですが -O7って有効オプションなんですかね?
85 :
デフォルトの名無しさん :03/03/22 11:44
GCCでC++のアセンブラ見てみると 関数に__Zってつくけどこれなんの略なの?
87 :
デフォルトの名無しさん :03/03/22 11:54
cygwinの最新セットで、c++filtがちゃんとデマングルしてくれない・・・。 ちゃんといける?
int64みたいな感じで、ビット長固定の変数が欲しいのですが、gccにもそういうのはあるのですか?
>>88 無いのでたいてい、
typedef char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef long long int int64_t;
みたいにする。当然CPUアーキテクチャ別に定義しなおして。
>>89 C99 で標準化されてる stdint.h/inttypes.h とか。
91 :
デフォルトの名無しさん :03/03/23 12:39
>90
こんなもの一番最初に定義しておくべきだったのにな。
で結局
>>89 みたいなのがプロジェクトごとに乱立することに・・・
93 :
デフォルトの名無しさん :03/03/23 15:01
>>92 BCBLやBはbit長にベタベタ依存したプログラムが続出したから、
Cでは、そのカウンターカルチャーとしてユーザ定義の型からもbit長を追い出した。
行き過ぎの面もあるけど、当時のプログラマの民度においては意義があったと思う。
最近は、プログラマの責任、ということでいいだろうね。
ところで、C++ iostreamのfmtflagsは、当初"int"で何だかな─と思ってたけど、
enumにしてもいいようになったよね。libstdc++はenumになってる。
GCC自体をコンパイルするときに ./configure につけるオプション(--enable-threads=posix みたいなの) の解説してるサイトや文章ってないですか?
>>95 サンクス。
GCC3.4そのままconfigureしてたら
かなり変なのができたので困ってた
97 :
デフォルトの名無しさん :03/03/28 03:45
gccでCプログラムから自動的にSSEコード吐ける?
>>97 無理でしょ
SSEがどういうものかわかってたそういう質問しないと思うが。
いちおgcc(cc1)には-msseオプションがある
gcc -msse hello.c
Intel Compilerだと自動的に並列化できる部分を探してSIMDにするらしいから、 gccではどうなのかなあと思って。
あと -mfpmath=sse
さまざまな環境で動くgccに対して、特定の環境に依存する最適化は 多くは期待できないような。
んなこたーない
gccはP5のペアリングの最適化とかAthlonのプリフェッチの最適化とかやってくれるよね?
egcs以降(2.9以降)はPentium系の最適化が驚くほど良くなった それ以前のはサッパリだめだった i386系以外はどうだか知らない
105 :
デフォルトの名無しさん :03/04/01 09:18
gcc-3_3-branchをビルドしています。 ../3.3/../../.. /usr/lib/crtendS.o /usr/lib/crtn.o -Wl,-soname -Wl,libgcj.so.4 -o .libs/libgcj.so.4.0 /usr/apps/i386-unknown-netbsdelf1.6Q/bin/ld: cannot open javax/naming/.libs/CommunicationException.o: Memory exhausted collect2: ld returned 1 exit status javaのlibgcj.so.4.0のビルド中にこういったエラーが出てしまいます。 みなさんのところではちゃんとビルドできていますか?
105ですが、かなりlibgcjのso,aともにかなりのサイズなので、 ulimitでひとつひとつ全ての項目のリソース制限を外したら 上手く行きました。しかし巨大ですね。。。これでもインタプリタ よりは効率はいいのかな。
効率がいいわけがないだろ。 今のJavaのHotSpotはかなりのもんだぞ。 あと数年はgcjは趣味レベルだろう。
特許で潰されるやろ
>>97 3.2.2 で -msse コンパイルしたもの。
元ソースはヒミツ(ていうかまだコード評価の段階)だが
__attribute__ (mode(V8QI))
とか
__builtin_ia32_xxx()
とか入りまくってる(w
インデント抜けまくりなので心して嫁
.L10:
movq %mm2, %mm4
pxor (%edx), %mm4
movq %mm3, %mm6
punpcklbw %mm4, %mm6
pextrw $0, %mm6, %eax
pxor (%ebx,%eax,8), %mm1
pextrw $1, %mm6, %eax
pxor 512(%ebx,%eax,8), %mm1
pextrw $2, %mm6, %eax
pxor 1024(%ebx,%eax,8), %mm1
addl $16, %edx
pextrw $3, %mm6, %eax
decl %ecx
pxor 1536(%ebx,%eax,8), %mm1
jns .L10
よく考えたら
>>97 は浮動小数点演算させたいんだよな。
float foo(float a, float b, float c){return a + b * c;}
$ ./cc1 -O6 -fomit-frame-pointer -msse2 -mfpmath=sse
foo:
subl $12, %esp
movsd 32(%esp), %xmm1
mulsd 24(%esp), %xmm1
addsd 16(%esp), %xmm1
movsd %xmm1, (%esp)
fldl (%esp)
addl $12, %esp
ret
111 :
デフォルトの名無しさん :03/04/11 21:14
(^^)
113 :
デフォルトの名無しさん :03/04/26 08:25
リリースあげ
114 :
bloom :03/04/26 08:26
inline assemblerの書き方がわからん
gcc3.2で究極に最適化してコンパイルしたいんですが、 最適化のオプションはどのようにすればいいでしょうか?
>>117 man gcc か gcc --help
119 :
デフォルトの名無しさん :03/05/10 20:50
>>117 117の環境がワカランが、とりあえずもまえがつこうてる
CPUのメーカが作ったコンパイラを金を出して買うことだ。
GCC使ってて最適化など当てにするな。
>>117 俺は
-O4
-mmmx
-msse
-march=i686
-funroll-loops
-fno-strength-reduce
-finline-functions
-frerun-loop-opt
-fschedule-insns2
-fomit-frame-pointer
-fmove-all-movables
ってやってる。文句あっか?
121 :
デフォルトの名無しさん :03/05/11 01:26
Linux用の非商用バージョンならロハで使えるわけだが >Intel C++/Fortran Compiler
123 :
デフォルトの名無しさん :03/05/11 13:47
ロハって何の略なの?
ありがとう。
>>126 Linux用の体験版の隣に非商用版があるだろう?
>>123 略ではなく、「只」という字を分解したもの
>>117 どうしても金がないなら、
GCCの最適化を自力で強化する事だな。
「究極」に最適化したいんだろ。
ここで言うのもなんだけど、GCCよりもアルゴリズムを最適化した ほうが早くなるよ。
forとwhiteとswitch つかわなきゃいい
RTL自分で書けばいいんでないかい?
134 :
デフォルトの名無しさん :03/05/11 20:53
120で-O4と書いてるけど、O3まででは? 他にもいろいろ書いてるけど効果ある?
>>133 *.cも直した方が楽。
ちょっと凝った事やらせるとRTLじゃ書けない。
>>134 3までだけど、もっと大きい値を指定しても別にエラーになるわけじゃない。
>>134 最近は9だったか99まであります。
どう変わるかは知らんけど。
printfのフォーマット文字列と引数の関係を調べてくれるのがありがたい。
139 :
デフォルトの名無しさん :03/05/12 05:18
$gcc -S hello.c ってやると80386のアセンブリコードが出力されるけれども、 これをMIPSのアセンブリコードを吐かせるようにするには どうすればいいのですか?
>139 mips-elf-gcc とか。
>>139 gccのソースもってきて
対象CPUに./configure
アセンブラを実行可能形式にしたいなら
binutil/glib
も./configure
142 :
デフォルトの名無しさん :03/05/12 11:33
最近、MSYS1.0とmingw-2.0のみのCygwin無し環境で色々と遊んでいるのですが、 gcc-2.95.3をコンパイルしようとすると、 #./configureのオプションは--enable-language=C++のみ make bootstrapの途中で xgcc.exe: installation problem, cannot exec `as': No such file or directory というアセンブラが見つからないというメッセージが出て失敗します。 as.exeやar.exeはPATHの通っている場所にあり原因は不明です。 ググってみたところ同じ問題で悩んでいる人もいるようですが、 結局原因と解決方法はよくわかりませんでした。 どなたか詳しい人いませんか?
>>142 > #./configureのオプションは--enable-language=C++のみ
Cは指定しなくても入るんだっけ?
入らないとgccビルドのstage2ができませんな。
MASM形式のアセンブラ出せませんか
コードジェネレータを書き換える
>>145 gcc/config/i386/i386.{c,h,md}
を修正。
質問です。 class B; class A{ B b; }; class B{ A a; }; VCではコンパイルできるのですが、Cygwin gcc-3.2 でエラーになります。 何か書き方があるのでしょうか。
あ、書き込んだ後で気付いた。ポインタになってなかった… ごめんなさい。鬱
150 :
デフォルトの名無しさん :03/05/15 08:50
3.3リリースage
151 :
デフォルトの名無しさん :03/05/15 17:25
stdlib.hを使ういたいときのコンパイルオプションってどんなのですか?(数学関数なら-lmみたいな)
>>151 他のヘッダーファイル同様、ソースに#include <stdlib.h>と書けば使える。
インクルードディレクトリがきちんと設定されていなかったら、-I<DIR>
153 :
デフォルトの名無しさん :03/05/15 17:34
>>151 レスありがとうございます。
うーんちゃんと#include <stdlib.h>ってかいてあるんですけど
どうも使えないのです、、、
学校で使っているLINUXなのですが、僕にはそのLINUXがさっぱり判らなくて、、、
math.hも-lmってオプションつけないとエラーが出るんです。
でもおっしゃるようにインクルードディレクトリの問題かもしれないので
-Iを試してみます。
>>153 -lm(というか-l<lib>)はリンクオプションだよ。
もしかしてstdlib.hで宣言されている関数を使おうとしたけど、「undefined reference to 〜」とかエラーがでたの?
なんという関数を使おうとしたの?
156 :
デフォルトの名無しさん :03/05/15 22:06
>>154 はい、そうなんです。使いたい関数はitoaとsprintfなんですが、、、
しかしリンクオプションと言うのですか、不勉強で判りにくいこと言って申し訳ないです。
>>156 itoaなんかないと思うぞ。sprintfはstdio.h
sprintfならlibc.aに含まれているはずだから、特に指定しなくてもリンクされると思うけどなぁ。
綴り間違いはない?
158 :
デフォルトの名無しさん :03/05/15 22:32
え?そうでしたか、、家のVC++ではitoaはできたのですが。。 sprintfはitoaが使えないので学校ですこし試しただけなので、つづりや 書式が間違ってたのかもしれません、次に確認してみます。
>>158 そりゃあ、VC++にはitoaがあるからな。
itoaはCの標準関数じゃないからあると期待してはいけない。
iota
3.3を何も考えずに入れたら-Vの挙動が変わってますな。 3.2と共存させようと思ったのに。 共存させる場合は、今使ってるコンパイラドライバを どこかにコピーしておくと幸せになれます。
iowa
gccで、アセンブラのサブルーチンを呼び出したい んですが、保存しなければならないレジスタってどれでしょうか?
164 :
デフォルトの名無しさん :03/05/17 15:26
>>163 info gcc
むしろ、インラインアセンブラにした方が楽と思われ。
>>166 もういっぺん、マニュアルを読んでみよう。
何度読んでもさっぱりだっつーの!
__asm__ __volatile__ ( "call %1;addl %2,%%esp;movl %%eax,%0;" :"=r" (tmp) :"r" (tmp), "r" (count), "r" (tmp) : "%eax", "%esp" ); 例えばこれの説明おねがいします
>>169 Assembler Instructions with C Expression Operands
読んでないから説明はできないけど多分infoのここを読めば分かるのでは
おいおい誰もしらんのか!
誰も知りません。よって終了。 マジレスしたやつには「釣れた(藁」を送ります。
いや、ネタじゃなくてマジで教えて欲しいんですが
>>172 知らないからといって質問を妨害する行為はどうかと。
俺も知らんけどさ。
>169 関数コールしてスタックを戻したあと、返値を変数にストアしてるだけ。
そういうことなのか?
>>175 どこコールするつもりなの、この関数で(w)
ま、169が書き間違ったんだろうが。。
>>169 こんな感じかな?
レジスタの割り当ては適当。
movl tmp,%%ebx
movl count,%%ecx
#APP
call %%ebx
addl %%ecx,%%esp
movl %%eax,%%ebx
#NO_APP
movl %%ebx,tmp
>>178 そのAPPやらNO_APPってなんですの?
にらめっこですわよ
(´・∀・`) ヘー
>>179 asm("〜");
を展開したところの印。
ソース吐かせてみるとわかる。
183 :
デフォルトの名無しさん :03/05/21 19:10
g++ 2.96 と g++ 3.2.2 で試したのですが、 -I(インクルードのオプションね)を使うと /usr/include/g++-3/cmath: In function `float abs (float)': /usr/include/g++-3/cmath:40: `fabs' undeclared (first use this function) /usr/include/g++-3/cmath:40: (Each undeclared identifier is reported only once for each function it appears in.) ってエラーが出るんですけど、何が原因なんでしょうかね? このオプションを使わないと何もエラー出ないんですけど。
184 :
bloom :03/05/21 19:11
g++ -I/home/xxxx/xxxx/xxxx/include -g -D_DEBUG -c -o debug/xxxx.o xxxx.cpp
とか
g++ -I.. -ansi -pedantic -Wall -Wno-long-long -D___MAC___ -g -D_DEBUG -c -o debug/xxxx.o xxxx.cpp
とか。
これで #include <iostream> とか
#include <fstream> とかすると、
>>183 みたいなエラーが出ました。
>>187 こっちでも適当なテストプログラム作ってみたら
エラー出ませんでした。
でも、やっぱり問題のプログラムではエラーが出ます。
ということは、もしかしたら何かファイル名がコンフリクトしてるのかもしれません。
ちょっとチェックしてみようと思います。
と探してみたら、すぐ math.h というのが見つかったー。 そういやこんなの作ってました。 どうもお騒がせしました。
1つ上のディレクトリを指定して 冗長に #include<xxxx/xxxx.h> とインクルードするようにしたら 解決しました。 ホンマ、ボケボケでした。 よくライブラリがこうするようになってるのは そういう理由だったのね...。 ひとつ勉強になりました。
191 :
デフォルトの名無しさん :03/05/21 22:17
現在のGCCの最新verはいくつですか? あと、それのmingwバイナリを落とせる場所教えて欲しいのですが・・
193 :
デフォルトの名無しさん :03/05/27 14:41
コンパイルの時に出るエラーですが、makeでやると表示されません。 エラーにならないんじゃなくて、エラー内容が出ないんです。 別マシンの別環境なら大丈夫なんですが。 どなたか、同じようなことになって直した方がいらっしゃったら教えてください。 makeのバージョンは3.79.1です…これか?
>193 環境書けや。
cygnus上でクロスコンパイルしています。 linuxは素人同然なのでアレなのですが… コマンドライン(?)でコンパイルした場合、ワーニングやらエラーがあればそれが出ますよね。 makeでやるとそれらがまったく出ずに make: *** [xxxx.o] Error 1 だけしか表示されないんです。 知りたいのは、そうなる(する)には要因というか原因というか… ・makeにオプションがある ・makefileの書き方に問題がある ・コンパイラにオプションがある ・コンパイラをビルドし直す 自分ではそれ位しか思いつきませんでした。 直し方というか、逆にこうすればmakeでメッセージを表示しなく出来るよ的な事を知りたいと思いました。 とりあえず現状ではエラーが出た時にそれだけコマンドラインでコンパイルしてメッセージを表示させています。 非常に非効率的であります(自爆 微妙に板違いな感がありますが…
>>196 cygwinの問題だと思う。
cygwin1.dllのバージョンとか、どうやって動かしてるか(コマンドプロンプト
からかtelnetかそれ以外か)とか分からんと何ともいいようがないが。
おそらくUNIX板のcygwinスレの方が適切と思われ。
>>197 レスありがとうございます。
もう少しやってみてから教えて頂いたスレに行ってみます。
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
200 :
デフォルトの名無しさん :03/05/28 15:04
age
>>196 -nオプションつけて何が実行されるか見てみれば?
-npでルールを見るのもいいかも試練
皆さんありがとうございました。 調べてみたらクロスコンパイラのディレクトリに古いcygwin1.dllがありました。 それをなくしたらちゃんと表示されるようになりました。 自分でビルドしたものではなかったのでうかつでした。
Mac OS X, GCC 3.2.2 です。 ライブラリ作成に挑戦しているのですが、 ライブラリの作り方が間違ってるのかどうか分かりませんが、 場合によってシンボルが未定義と言われるか 言われないかが変わってしまって困っています。 先ず、ディレクトリ構造はこんな感じです。 lib libxxxa.a libxxxa libxxxa.a test a libxxxb libxxxb.a test a libxxxa/libxxxa.a は libxxxa.a: ${OBJS} ar -rcv $@ $? ; \ ranlib $@ のように作っています(一部マクロを展開しています)。 lib/libxxxa.a はそれをコピーしたものです。 libxxxb/libxxxb.a も同様に作成しました。 libxxxb は libxxxa で作ったヘッダファイルをインクルードしてますが、 ライブラリ libxxxb/libxxxb.a には lib/libxxxa.a の内容を追加していません (というか、方法が分かりません)。
libxxxa/test/a は a: ${OBJS} g++ -L../../lib -o a ${OBJS} -lxxxa のようにして lib/libxxxa.a をリンクし、 これは問題なくリンクできました。 問題なのは libxxxb/test/a で、 a: ${OBJS} g++ -L.. -L../../lib -o a ${OBJS} -lxxxa -lxxxb のようにリンクすると、libxxxa.a で定義されているはずのものが 未定義だという文句が返ってくるのです。 このオブジェクトは両方の test/a 内で使われているにも関わらずです。 なぜこのような違いが出てくるのでしょうか? 何か心当たりがあればご教授お願いします。
質問ですが、gcc で作った実行ファイルは商用利用が可能なのでしょうか・・・ できる場合も gcc でコンパイルしたことを明記しないとだめとかありますか?
>>204 g++ -L.. -L../../lib -o a ${OBJS} -lxxxa -lxxxb -lxxxa
にしてみたらどうなる?
判明した情報を追加。 その未定義シンボル(と言われたもの)は libxxxb で使われたシンボルのようです。 このあたりが悪さをしているようです。 で、libxxxb.a に libxxxa.a を追加する事で解決しました。 で、-lxxxb とリンクすれば、問題なくリンクできました。 ar に ../../lib/libxxxa.a を追加しただけなのですが... 本当にこれでいいんでしょうか?
>>207 それでいけました!
順番が重要だったんですね。
ありがとうございました。
あれ?
>>208 の方法をもう一度やってみたらだめでした。
>>207 の方法はいけますけど。
ライブラリの合成法がやっぱ違うんでしょうかねぇ...。
ranlibしそこなってるのかな。 本来ならranlibすれば後方参照もしてくれる気がするんだけど、 うまくいかない場合は -lxxx の位置を前後させたり 再度指定してやると吉。おまじない程度に覚えておきましょう。
>>205 gcc自体は大方問題ないことになったはずだけど、
むしろリンクするライブラリについて注意を払ったほうがいい
214 :
デフォルトの名無しさん :03/05/30 23:36
>>204 xxxb, xxxa内のシンボルの参照関係はどうなってるの?
g++ -L.. -L../../lib -o a ${OBJS} -lxxxb -lxxxa
だとどうよ?
>>214 今はそういう風にやってます。
ライブラリが多くなってくると指定が長くなって、
いざ使おうとすると面倒になってしまうのですが
(まぁ、最初に Makefile を作る時の一度だけですが)、
複数のライブラリを合成する方法ってありますか?
>>215 > 複数のライブラリを合成する方法ってありますか?
オブジェクトを展開してar。
>>215 それで済んでいるのなら、
・xxxbでxxxaのシンボルを使っているが、
・xxxaではxxxbのシンボルを使っていない
ただ、これだけのことでしょう?
>>207 である必要はない。
参照される方を後ろに書く仕様なんだよ。
それを知らなかったから悩んだだけの話で、その失敗を、
> いざ使おうとすると面倒になってしまうのですが
> (まぁ、最初に Makefile を作る時の一度だけですが)、
> 複数のライブラリを合成する方法ってありますか?
としようとするのは短絡としいか言い様がない。なにをしようと起きた失敗はなくせない。
gcc特有じゃないから、続きはくだ質スレで。
×gcc ○ld
>>217 参照される方を後ろに書く、というのはもう既に分かってます。
だからこそ
>>207 ではなく
>>214 にしてるわけで。
こういうライブラリ拡張を何段階もやってると、
最終的なライブラリを使おうとすると、
その度に -lxxxe -lxxxd -lxxxc -lxxxb -lxxxa とか書かないといけないのが
面倒だという話です。
いちいち順番を気にしないといけませんし。
libxxxa.a を libxxxb.a にコピーしてオブジェクトファイルを追加、
という方法でならできますが、
libxxxa.a を更新したら libxxxb.a を全更新しないといけないのが
エレガントじゃないなぁ、とも思います。
かといって、libxxxb から libxxxa のオブジェクトファイルも
アーカイブしようとすると、
Makefile を作るのが面倒になってしまいます。
できるなら既に作られているライブラリ同士をくっつけることができると嬉しいです。
UNIX プログラミング質問すれに移行しようかと思いましたが、
スレ移行時期のようなのでここで続けようと思います。
220 :
デフォルトの名無しさん :03/06/01 02:36
このスレみて勉強してるんで、 上げちょってください。
>>219 -Wl --start-group --end-group
>>221 うちの ld には --start-group と --end-group フラグがないようです。
検索しても何をするものか書いてるページは見つかりませんでしたが、
多分、この中では前方参照後方参照どちらでもできるというもの、だと推測します。
まぁ、使えなければ何をするものか分かっても
どうしようもないんですけどね...。
情報ありがとうございました。
> うちの ld には --start-group と --end-group フラグがない 何見てそう判断したんだ?
>>223 使って、エラーメッセージ見て判断しました。
あ、もちろん、man も見ました。
>>205 ほとんどの GCC では、
>>206 の言うように問題ないと思うけど、
中には cygwin のやつみたいに、ライセンスの制限がかかったりするのもあるんで、
一回はちゃんとドキュメントを読んだほうがいいよ。
ありえないとは思うけど、
>>205 の使ってる GCC がすんごい変なやつの場合は、
できたバイナリを商用にするのを禁止してる可能性があるかも。
# cygwin は普通にビルドすると、そのバイナリは GPL で配らないとダメ。
# 別に、GPL でも商用にできるけどね。
>>226 > # cygwin は普通にビルドすると、そのバイナリは GPL で配らないとダメ。
どこに書いてあった?
>>227 > Mac OS XってGNU ldじゃないのか?
基本的にMac OS Xのcc環境はgccなんですが、
NEXTSTEP由来のldを使ってます。dynamic link関係も全然違う機構です。
それからcppもgccのと違って独自のものに入れ替えてますね。asは、
$ as -v
Apple Computer, Inc. version cctools-435.obj~4, GNU assembler version 1.38
ですね。ELFじゃなくて、Mach-Oだから改造してるんでしょうね。
http://www.opendarwin.org/cgi-bin/cvsweb.cgi/src/cctools/ と公開してますが、gas側はこんなの(not ELF)はmergeしてくれないかも。
ELFにすればよかったのにね。
>>230 独自路線が好きだからな。
MPWはとんでもなかった。
今でもディレクトリ構成とか強烈らしいが。
$ /usr/libexec/gcc/darwin/ppc/cpp-precomp -v Apple cpp-precomp 6.14 (devkit-213/devkit_tools-214) こんなheader pre-compilation付きcpp使ってるですよ。 後、cppの文法も緩くなっているみたいですね。(過去資産問題) 面白いのは、dynamic linkにもprebindingの機構があることですね。 ライブラリを入れ替えると、関連実行ファイルをredo_prebinding(1)する。 パッケージのインストーラが「最適化中…」というのはこれ。 MIPSのa.outにも同じような機構があった。
>>230 libbfdを作れればマージしてもらえそうな気もしますが。
powerpc-pc-macos-machoとか。
234 :
デフォルトの名無しさん :03/06/09 13:58
gccの「エラー原因の詳細」と「エラーの一覧」が 載ってる本かHPってありますか?(日本語で) 使ってるのはgcc3.2です。
あ、ここsage進行のようですね。 ageちゃってゴメンです。
236 :
デフォルトの名無しさん :03/06/09 13:59
GCCが吐くエラーなんて、構文ミスかリンク不能くらいだろ。
まとまった資料ってあるのか? infoにもなかったような気がするが。
ていうか 3.2 なら LC_ALL を設定してやれば日本語でエラーメッセージ出ない? // かなり怪しい日本語だけど(ワラ
>>241 3.1からそうなってるけど、却ってわかりにくくってねえ。
自分で入れる時は--disable-nls必須
そーかなぁ?漏れはエラーメッセージが意味不明だった時には LANG=C gcc ........ ってやるようにしてるなぁ。そっちの方が良くね? まぁ人それぞれと言われりゃそれまでだが。
3個の引数を渡しますです。
>>243 俺もやってる。なんか意味不明なこと言った時のために --disable-nls はしてないんだけど、
どっちかっつーと日本語のほうが意味不明のような…。
入りますディレクトリ 出ますディレクトリ
全然質が悪いよな、GNUのソフトのメッセージの翻訳。 誰かもっとマシな翻訳作ってないのかよ。フリーソフトなんだからよ。
makeのは直そうと思ったことあるんだけど、元のメッセージから直さなきゃい けなくて、そうすると全言語分影響されちゃうんだよ。
>>250 3.79.1では、英語の語順に依存して組み立てるコードになってる。簡単に言うと、
printf("%s directory `%s'", "Entering", dir)
みたいな感じ。こういうのはメッセージの翻訳を考えるとよくないとされてる。
3.80では(多分翻訳者から文句を受けて)これが"Entering directory `%s'"みた
いに改善されたんだけど、日本語の翻訳者はヴァカなので、Entering directoryも
Leaving directoryも両方単に「ディレクトリ %s」になってる。
とにかく「出ます」「入ります」を外せば批判はかわせるとでも思ったんだろうな。
もうね、(略
>>251 お、3.80じゃ元は直ってるのか。
ja.po直すだけならまだ楽だな。
format で引数を解釈する順番変えれなかったっけ。
%2$s とかのことか?
ツーカそのへんは訳さなくていいと思うが。
>>251 3.80だったら、どう考えても、
「ディレクトリ'%s'に入ります。」
「ディレクトリ'%s'から出ます。」
だよな〜。
main.cより
char *msg = entering ? "Entering" : "Leaving";
>>253 3.79.1だとそもそもこうなってて、語順を変えることもできない。
msgid "Entering"
msgstr "入ります"
msgid "Leaving"
msgstr "出ます"
msgid "directory `%s'\n"
msgstr "ディレクトリ `%s'\n"
>>257 msgid "Entering"
msgstr "入りますディレクトリ"
msgid "Leaving"
msgstr "出ますディレクトリ"
msgid "directory `%s'\n"
msgstr " `%s'\n"
ってやればいいんじゃない?
藁わなかた
261 :
デフォルトの名無しさん :03/06/15 05:09
入る・出るじゃカッコワルイから 遭遇・退去にしてみてはどうか。 ディレクトリ%sに遭遇 ディレクトリ%sから退去
は?
ディレクトリ'%s'に進出 ディレクトリ'%s'から転進
ディレクトリ'%s'に侵攻 ディレクトリ'%s'から撤退
265 :
デフォルトの名無しさん :03/06/15 22:07
突入 退却
266 :
デフォルトの名無しさん :03/06/15 22:08
ディレクトリ%sにぬるぽ ディレクトリ%sからガッ
たなか%sにえ きたの%sから
入ります:ディレクトリ%s 出ます:ディレクトリ%s と、コロンを入れるだけで読めるようになるんだが。
挿入 排出
みなさまmakeネタで引っ張りすぎでわ?
そろそろ、gccネタ(
>>244 )でよろ。
まあ、結局のところ、日本語では普通、ディレクトリに入る・出るとは言わんだ ろ、というこっちゃ。
既存の hoge.dll からインポートライブラリ hoge.a を 作るにはどーしたらいいの?
あっちの世界ではインポートライブラリって言うんだ。 初めて知った。
>>239 構文ミスかリンク不能くらいかも知れないけど、一覧が欲しいんです。
お前等、早く教えてください。
>>274 gcc のソース落としてきて、gcc-x.x/po/ja.po でも見れ。
276 :
デフォルトの名無しさん :03/06/18 23:34
ようこそ G・C・C って知ってる?
しらん
278 :
デフォルトの名無しさん :03/06/27 00:56
cygwinのg++を少し使うことになりまして、質問ですが、 コマンドを実行するとき、stdlibのsystem()を使う以外に gccのおすすめがあるんでしょうか?
exec
>>278 一体、俺のどこが不満なんだ。
返事は"UNIXプログラミングスレ"へ。(cygwinでって書いてね)
>>205 絡みの問題(ライブラリ周り)を引っ張ってみる
gccでビルドする場合、大抵はglibcを使うことになると思うが、
glibcは将来的にGPL(現在はLGPL)化されるよう(
http://linux.nikkeibp.co.jp/faq/200107-3.org.html参照 )なので
その際はglibcを使った全てのソフトウェア(性質上、staticリンクしているものもdynamicリンクも)は
GPL下で頒布することが義務付けられるわけかな?
OSの基本機能がGPL下にある場合は適用外と解釈されているようだが、Windows上でgcc+glibcを使ってプログラムを組む場合、
glibcはOSの基本機能ではないのでこの場合全てGPLにしろとなるのか…
もしそうなると、フラウンホーファのMP3関連特許料請求やらUNISYSのLZW関連特許料請求よりもタチの悪いことになるわけだが…
そもそも、GPLは将来新バージョン(GPL3とか)が出た場合に、プログラム作成者側で
GPL3ではなくGPL2で頒布するというような選択を出来ない(らしい;
http://motoyuki.bsdclub.org/d/d200103a.html参照 )わけで
GPLがFSFに都合よく改変されても文句言えない、と。
個人的にはあまり好きじゃない。
GPL議論は他所でやれって言われそうだがなぁ・・・
>gccでビルドする場合、大抵はglibcを使うことになると思うが、 へ?
glibcなんか使わなくてもいくらでもコンパイルできますが何か?
ん、完全な誤解? linux標準はglibcで、Cygwinにくっついてくるのもglibcだと思ってたんだけど
だからlinuxはGPLだしcygwinもGPLだろ。 でもBSD UNIXやMacOSXはgcc使ってるけどGPLじゃない。glibc使ってないから。 何の問題が…?
>288 まず、glibcはLGPLだと思うけど > だからlinuxはGPLだしcygwinもGPLだろ ちょっとかみ合ってない気がするが Linux上でglibcを使う全てのソフトウェアはGPLかというと、そうじゃないでしょ それはglibcが現状ではLGPLだからであって、将来的にGPL化するとglibcを使う全ソフトのGPL化が強制されるのか?と そこを言いたいんだけど
cygwinてglibcだったっけ? NetBSDのlibcから作ったって聞いたような
>>289 ようするに…
LGPLで提供されていた、とあるライブラリ(Aとする)があって、
それがnew versionになるとともにLGPLからGPLになってしまった。
あるプログラムBはラ、イブラリAを使っている。BはそれまではGPLでは
なかったのだが、これを機にGPLにしなければならないのか?
という質問だよなぁ?
単にLGPLだった時のversionのライブラリAを使いつづければいいだけじゃ?
#gccと関係ねーなぁ
>>294 ライブラリのバージョンアップではなく、ライセンスのバージョンアップ
GPLのバージョンアップにより、GPLなライブラリは新GPLで解釈されることになり、
新バージョンのGPLが現在のLGPLの内容とconflictするものであれば
新GPLが優先され、結果として現バージョンのライブラリでも将来的に勝手にGPLになり得る って話
gccつーかglibc話なんだけどね
298 :
デフォルトの名無しさん :03/07/02 12:43
自作でライブラリを作ったとして、それの検索パスはどうやってリンカに指示すればいいのでしょうか?
-L
300 :
デフォルトの名無しさん :03/07/02 13:16
>>298 どうもです。Lオプションでディレクトリを指定すればいいんですね。
gcc -o hello.out -L /hoge hello.c
で、/hogeにライブラリを置いておけばいいということですね。
毎回、指定するのではなく、デフォルトの検索パスに含めることはできないのでしょうか?
Node: Environment Variables Environment Variables Affecting GCC =================================== `LIBRARY_PATH' The value of `LIBRARY_PATH' is a colon-separated list of directories, much like `PATH'. When configured as a native compiler, GCC tries the directories thus specified when searching for special linker files, if it can't find them using `GCC_EXEC_PREFIX'. Linking using GCC also uses these directories when searching for ordinary libraries for the `-l' option (but directories specified with `-L' come first). 環境変数の指定もイヤなら、specファイルを書き換えろ。
/usr/local/libに放り込んじゃえば?
Makefile 書けばいいんじゃないの?
Makefile.am 書けばいいんじゃないの?
amはおっとメーク!
書き込んでから後悔するパターン
>>303 -
>デフォルトの検索パスに含めることはできないのでしょうか
当方、悪名高きGCC2.96(Redhat7.1のgcc-2.96-112.7.1) を使っているのだけど、最適化オプション(-O以上全部) をつけてコンパイルすると勝手に-ffast-mathが指定され てしまう模様。-fno-fast-mathも意味なし。 infoにも 「-ffast-mathはIEEE/ISO規格に違反することになる から、どんな-Oをつけても勝手に有効にならない」 って書いてあるから明らかにバグだと思うのだけど、 他バージョンをbuildできるリソースが足りないので 自分で確認できないのです。 このバグが確認できる・確認できないバージョンを 教えてもらえませんか?
どこからそう判断した?
大切なとこ書き忘れて失礼。 sqrt(-1)というような、errnoがEDOMになるべき 数学関数呼び出し(manに書いてある仕様より)の後 でも、-Oをつけると常にerrnoが0になることからです。 これは、-ffast-mathの挙動と同じはずです。 一方、オプションをつけずにコンパイルすると 仕様通りのerrnoになります。 また-ffast-mathのみを指定した場合と、-Oだけ指定 した場合共に、プリプロセスの段階で数学関数が インラインで定義されていることを、-Eオプションで 確認しました。 オプションなしのコンパイルでは、こうはなりません。
gcc -vで確かめろよ
間違えた。vじゃねぇや。忘れた。スマソ
>>310 3.2.2でも一緒。つーか-Oを付けると-lmも不要になるな。
$ LANG=C gcc -v | tail -1
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
$ echo 'int main(){printf("%d,%f\n", errno, sqrt(-1));}' |
>> LANG=C gcc -O -include errno.h -include stdio.h -include math.h -xc - &&
>> ./a.out
0,nan
$ echo 'int main(){printf("%d,%f\n", errno, sqrt(-1));}' |
>> LANG=C gcc -include errno.h -include stdio.h -include math.h -xc - &&
>> ./a.out
/tmp/ccIKCX5e.o(.text+0x1b): In function `main':
: undefined reference to `sqrt'
collect2: ld returned 1 exit status
$ echo 'int main(){printf("%d,%f\n", errno, sqrt(-1));}' |
>> LANG=C gcc -include errno.h -include stdio.h -include math.h -xc - -lm &&
>> ./a.out
33,nan
>>311 -Sのこと? 試してみます。
>>313 おお、どうも…と言いたい所だけどツッコミ所
満載のご様子。
-lmが不要になるのは、自分が書いたとおり
プリプロセス段階で直に定義されたからでしょう。
このコードがerrnoをセットしないと思われれ。
errnoは0で初期化しないとなんとも…。
さらには、関数の引数の評価順序も未定義ですので。
できれば上の二点を改良した上で、確認して
もらえますでしょうか?
けど仮に3.3でも直ってないことが確認できれば、
上流に報告しなくちゃだなぁ。
いろいろ調べ直してみました。
まず
>>310 には誤りがありました。
-ffast-mathのみでは、プリプロセスの段階で数学関数は定義されませんでした。
焦っててすんません。
それでinfoを見直したら、errnoをセットしない直接の原因は-ffast-mathでなく、それと連動して定義される-fno-math-errnoの方らしいので、以下-ffast-mathは忘れて下さい。
ということで-Sも動員して、-Oと-f{no-,}math-errnoを組み合わせてできる一通りを比較した結果。
・オプションなし、-fmath-errnoのみ、-fno-math-errno
の三つとも同じもので、errnoをセット
・-Oのみ、-O -fmath-errno、-O -fno-math-errno
の三つとも同じもので、errnoをセットしない
つまりは
『-f{no-,}math-errnoの指定は無視され、-Oで無条件に-fno-math-errno』
ということ、らしいです。
他にも同様のバージョンありますか?ちなみに使ったソースは以下です。
#include <errno.h>
#include <math.h>
#include <stdio.h>
int main(void){ errno=0; sqrt(-1.0);
printf("%d\n", errno); return 0;}
まぁgccのmanとinfoは昔から結構間違いがある訳で。 source見て確認するのが一番です。
>>316 3.2.2も同じだった。
3.3はまだインストールしてない。コンパイル時間かかるし。
>>316 Linux 以外ではそうならないので、glibc or glibc+gcc が悪いのでは?
>>317 それはそうでしょう。特にmanは。
ただ今回のは、文章側が正しくて実装にバグがあると判断しました。
info文中のニュアンスの強さと、最適化オプションつけるだけで
C89にまで非準拠になってしまっては誰もうれしくないだろう、という点で。
ただ、source見るのが一番というのにはもちろん同意。
自分に能力があるのか…は別にしても、ドキュメントに不信感を持ったら
最初からそうしたと思います。今回はバグであるという仮定をして、
その波及範囲が知りたいということです。
>>318 どうもっす。実際に困っていて、コンパイルできるディスクなどの
余裕がないのは間借りして使ってるLinuxの方ですが、
もし単なるオプションさばき周りのバグなら、他の環境でも
再現性ありそうですよね。
手元のCygwinでも3.3入れたりして、色々試そうと思います。
と書いてたら、
>>319 やはり。そちらの環境は?
>>321 FreeBSD
Solaris
Cygwin
どうもです。 手元のCygwin最新(1.3.22、gcc 3.2 20020927 prerelease)だと確かに、 318氏とは違うことになります。 -Oと-fno-math-errnoを「同時に」指定したときのみ、errnoセットを しないオブジェクトを吐きます。 どうもGCCとGlibcの連携の問題のようですね。 残りはまた後で追求します。 ありがとうございました。
なんか盛り上がってますね!
CygwinのgccでつくったDLLはVCやBC++Builderで呼び出せるの?
cygwin1.dll使ってるとまずいかも。 -mno-cygwinでコンパイルすれば大丈夫。
>>278-282 でグーグルから帰ってきた者です。
cygwinのgcc3.2でsystem()が使えないんです・・・
#include <cstdlib>
int main(){system(NULL);}
で-1が帰ってきます。(manによるとエラーは0らしいですが-1は正常?)
system("ls"); は127が戻ります
system("command.com /c dir"); も127が戻ります
なぜでしょう・・・
P.S execも返ってきます
>>327 > で-1が帰ってきます。(manによるとエラーは0らしいですが-1は正常?)
-1はエラー。実行できなかった場合。
$SHELLはちゃんと設定されてる?
>>328 .bashrcで
export SHELL=/bin/bash
としてあったと思います。cygwinインストールのデフォルトです。(ウロオボエ)
取り合えず会社行ってその辺の設定を見てみます。
#天気いいのに休出か・・・
プログラムをgccでコンパイルしたソフトは商用には使えないの?
ガイシュツ
>>328 echo $SHELL で、
/bin/bash
とでます。
今、家のPCにもCYGWINいれて試しましたがやっぱりだめです。
関係ないけど、ためしのプログラムをtest.exeで作成して動かなくて
1時間無駄にしました。
UNIX初めたばかりですがもうくじけそうです。シクシク
そっか!傷は浅いうちにやめとくか!(゚∀゚)
337 :
デフォルトの名無しさん :03/07/05 17:13
gccのソースってどこにあるの?
340 :
デフォルトの名無しさん :03/07/05 23:37
Linux RedHat9の標準のgccで、 -mtrd (可変以外の全関数をstdcallへ)をつけてコンパイルし、 プログラムを実行すると、「セグメンテーション違反です」と言われます。 付けない場合はうまくいきます。 gdbで色々調べた結果、エラー個所はライブラリ関数の様です。 /usr/include/のライブラリのヘッダファイルを見ると、 cdeclとかの記述が無く、呼び出し形式がまったく考えられてなさそうです。 ちなみにmingwのgccでは正常でした。 特定の自作関数でstdcallを使ってる個所があり、 またstdcallの方が小さくなります。 結構たくさんあるので、__attribute__ ((stdcall))をいちいち関数毎に 付けていくのはしんどいです。 以上の理由でどうしても-mrtdオプションを使いたいんですが、 どうすればよいでしょうか。
341 :
デフォルトの名無しさん :03/07/05 23:47
ちなみにlinux側のgccのバージョンは、 /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs から spec を読み込み中 コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infod ir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --w ith-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux スレッドモデル: posix gcc バージョン 3.2.2 20030222 (Red Hat Linux 3.2.2-5) mingw側のgccのバージョンは、 Reading specs from C:/MINGW/BIN/../lib/gcc-lib/mingw32/3.2/specs Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host= mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable -languages=f77,c++,objc,ada --disable-win32-registry --disable-shared Thread model: win32 gcc version 3.2 (mingw special 20020817-1)
>>340 で、info読んだの?
*Warning:* this calling convention is incompatible with the one
normally used on Unix, so you cannot use it if you need to call
libraries compiled with the Unix compiler.
それに、「小さくなります」だけの理由でなぜに「どうしても使いたい」と
なるわけ? 先に根本的な理由を示そうよ。方法を決め付ける前に。
343 :
デフォルトの名無しさん :03/07/06 00:26
>>342 既存のアセンブラルーチンが全部stdcall呼び出し前提なので・・
344 :
デフォルトの名無しさん :03/07/06 00:31
>>342 ちなみに、infoは間違いだらけだと聞いたので読んでません
>>344 「間違いだらけだからinfoもmanも読まねー」と言っていいのは
sourceを読んで動作が理解できる奴だけだヴァカ
Linuxって使えないですね。
間違いだらけだと聞かされてinfo読む気にはならんかもな。
348 :
デフォルトの名無しさん :03/07/06 00:41
で、結局使えないんですか?
>>342 「どうしても使いたい」という理由じゃ駄目なんですか?
実際つけると効果があるわけだし。
349 :
デフォルトの名無しさん :03/07/06 00:47
>>348 結論から言うと、ライブラリインクルードした場合は使えない。
gcc側で警告でも出せばいいとは思うけどな。
これはライブラリの問題。
うちの会社だと重障害扱い。
>>348 呼び出し既約に左右されるような関数で
実際の関数とプロトタイプを作る時に
何の工夫もしなかった、あんたが悪い
>>348 ライブラリも-mrtd付きで作りなおす。
>>349 標準じゃないABI使うんだから、一概にライブラリの問題とも言えないだろう。
352 :
デフォルトの名無しさん :03/07/06 00:52
了解です。 これからプロトタイプ書き並べる事にします。
ていうか、 「Unixでコンパイルされたライブラリを呼び出す必要があるなら、このオプションは使えない」のでしょ? 当然libcも含めて。
354 :
デフォルトの名無しさん :03/07/06 00:59
なんとかなりそうです。 ありがとうございました。
たまに間違いもあるけど間違いだらけというのは間違い、てなところか。
>>355 同意。どのみち、GNUで一番メンテされるドキュメントはinfoだろうし。
ちなみにGCCのinfoは最近、結構大きな改定があったのでは。
357 :
デフォルトの名無しさん :03/07/06 02:26
GCCで.NETで参照可能なDLL作れるんだってね(dotNet Magazine8月号より)。
>>349 > これはライブラリの問題。
なんだよ、コンパイラの全ての動作に対応しないと(ry
ライブラリの中の人も大変だな。
359 :
デフォルトの名無しさん :03/07/06 16:21
gccのヴァージョン3系列でどのbinutilsとgccの組合せが安定しているんだ?
>>358 ライブラリをインクルードする世界では、
そういう苦労もありなんでしょう。
最近gccのバージョンがあがってからの事なんだけど、 変数を宣言した時に、勝手に0で初期化されてるのって俺だけの環境ですか? 他にも、 int m; printf("m = "); scanf("%d", &m); int a[m]; a[0] = 0; ....... こんなのがエラーにならなくなった。 これっておかしいんじゃないですかねぇ。 環境はcygwin + gccでつ。
gcc3のCコンパイラはデフォルトでC99モードになってるよ。 アレはどうかと思う。
363 :
デフォルトの名無しさん :03/07/14 00:47
2進数を表記するパッチがあるんだけど 0xAA → 0b11001100 これに違和感ある人います?
一体、何のことだか。
0xA = 10 = 0b1010 じゃないのか?
>>365 はい。そのとおりです。
で、訂正
0xA = 10 = 0b1010
に違和感ある人います?
え、何が?
どっちかと言うと、1010bのほうが違和感ないけど… Cの文法から激しく外れるなぁ。 最後まで見ないと基数わかんないし。 で、それがなにか?
というか、なんで標準で 0b〜 使えないんだろ。八進数なんかは使えるのに。
8進数はファイル属性で便利っぽ
371 :
デフォルトの名無しさん :03/07/15 00:53
8進数は、テンキーしか入力装置がなかった頃、 その頃はモニターが10進数→バイナリ変換するのも大変だったわけだが、 の名残り。アメリカ人は結構8進数好きあるね。
Cで8進数がひいきされてるのは明らかにPDP-11のせいだろう。 でも2進数の表記が無かった理由としては弱いなぁ。
そういや、BASICでも数値を8進数や16進数の文字列に 変換する関数はあったけど2進数は無かったな。
ビットフィールド
ビットフィールドって、移植性落ちるよね。絶対。 まともな使い方知ってる香具師も少ないし。
>>375 ビットフィールドは、エンディアンによってのふるまいが
定義されていなかったからね。最初は。
>>376 今は定義されてるのでしょうか?
最近あるコンパイラでビットフィールドではまってたんで、
きになってます。
>>368 あー、えーとー
そういうパッチを作ったんだけど
あの、その、どうかなって・・・
ビット操作をちゃんと実装するパッチもあるんですけど ほしい人・・・いませんよね すみません。ごめんなさい
パッチって、gccの? gccをmakeして使う人がどれぐらい居るかだな・・。
382 :
デフォルトの名無しさん :03/07/15 04:24
>>379 というか、「ちゃんと」してるなら、本家にマージせよ。
二進数パーズもコマンドオプションでオフに出来ないとマージして貰えないと思う。
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
384 :
デフォルトの名無しさん :03/07/15 18:03
GCC 3.2 on cygwin なんですが malloc/free を独自の実装に置き換えたら スタートアップルーチン中の2度目の malloc 呼び出しで SIGSEGV してしまいます。 何故でしょう? ちなみに独自の実装と言っても、malloc 置き換えテスト用の static unsigned char buffer[1024 * 1024 * 1]; static int index = 0; void* result = buffer[index]; index += size; return result; みたいなやつで、実用には耐えませんが間違いは起こらないはずの物で 一度目の要求が 16 バイト、その次の(返した後に SIGSEGV喰らう)要求が 132 バイトなので 一見問題なさそうです。ちなみに下記はその時のスタックトレースです。 #0 0x6108be79 in cygwin1!cfsetispeed () from /usr/bin/cygwin1.dll #1 0x610893fc in cygwin1!cfsetispeed () from /usr/bin/cygwin1.dll #2 0x610892d3 in cygwin1!cfsetispeed () from /usr/bin/cygwin1.dll #3 0x61006d9f in cygwin1!__assert () from /usr/bin/cygwin1.dll #4 0x610076ed in dll_crt0@0 () from /usr/bin/cygwin1.dll #5 0x004026f2 in cygwin_crt0 () #6 0x0040103c in mainCRTStartup () #7 0x77e7847c in ProcessIdToSessionId () from /cygdrive/c/WINNT/system32/KERNEL32.DLL 誰かヒントお願いします!!
void* result = buffer[index]; ↓ void* result = &(buffer[index]); だた、炒ってこよう。
そして理由はわかりました。 誰かが realloc なんぞ使ってるからですた。 自分が使わないからって忘れ去った関数でも こういう時は覚えておかなきゃ駄目ですね。 ありがとうございました。
なんじゃそら
うわぁぁん。gdb でデバッグ実行すると普通に終了するのに 単体で実行すると 7376101 [unknown (0x254)] ? 1244 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION 7376256 [unknown (0x254)] ? 1244 handle_exceptions: Error while dumping state (probably corrupted stack) っていうのがイパーイ出るよぉ!なんで?誰か教えてー。
>>388 同じ実行ファイルなのか?
./付け忘れてないか?
>>389 同じ実行ファイルですた。
というか解決しますた。malloc 内に fprintf 書いてますた。
fprintf が malloc を呼んでいるようですた。
gdb で実行すると fprintf は実行されないんですかね?
っていうか標準出力も標準エラー出力も何も出なかったんですが…。何故?
>fprintf が malloc を呼んでいるようですた。 そうかあ? malloc呼ぶような事してるかな・・・ つーか、mallocやらfreeやらのすげ替えじゃなくて、 覆う様な方法は駄目なの? あと、そういうことするなら標準ライブラリの関数は呼んじゃ駄目だよ。 memcpy程度ならいいと思うけど。 cygwinじゃなくてmingwにしたら?
>>391 > malloc呼ぶような事してるかな・・・
よく考えたらフォーマット付文字列から可変個数の引数を受け取って出力するには
可変長の作業エリア必要ですた。スタックに確保する非標準関数もあった気がするけど…(なんだっけ、これも使わないから忘れちゃった)
> つーか、mallocやらfreeやらのすげ替えじゃなくて、
> 覆う様な方法は駄目なの?
リンカオプションの wrap なんちゃらっていうのを見つけたんですが、
リンカ生で使うとライブラリやらスタートアップルーチンやらが複雑でわけわかめなので
LD = g++
しちゃってて、隣家にオプション渡せないんですよ。どうしよう。
これ以外の方法だと、ライブラリが勝手に呼び出したりする部分は代えられないし、
自家製ヒープ管理の方がいざっていう時に無理矢理デバッグがしやすいので、
malloc/free ごと置き換えちゃえと。
> cygwinじゃなくてmingwにしたら?
最終的にビルドする時は mingw にするつもりだったりするんですが、
今回の件に関して cygwin と mingw に何か決定的な違いは?
-Wa,<options> カンマ区切りの <options> をアセンブラに渡す -Wp,<options> カンマ区切りの <options> をプリプロセッサに渡す -Wl,<options> カンマ区切りの <options> をリンカに渡す
>>393 ありがとうございます。そういえばそんなオプションもありましたね。
ところで(cygwin GCC の) crt0.o のソースって c でしょうか? 汗でしょうか?
cygwin はソース等もほとんど DL してて、
ローカルのディレクトリ内すべてを crt0.c と crt0.s で検索したんですが
何も引っかかりません。取り忘れたソースなのかなぁ?
396 :
デフォルトの名無しさん :03/07/18 01:55
% cat test.c
class func {
public :
template<class T, class M>
func(T, *T::M()){}
};
main()
{
func f();
}
% g++ test.c
test:c5: type specifier omitted for parameter `
Internal compiler error: Error reporting routines re-entered.
Prease submit a full bug report,
with preprocessed source if appropriate.
See <URL:
http://www.gnu.org/software/gcc/bugs.html > for instractions.
% g++ --version
g++ (GCC) 3.2.1 [FreeBSD] 20021119 (release)
Copyright (C) 2002 Free Software Foundation, Inc.
This is freesoftware; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
これはなんすか...?
>>395 ありがとうございます。おかげでだいぶ理解が進みました。
で、ソースを見てわかったのですが cygwin_crt0 からは処理が戻ってこないのですが
プロセスが終了する本当に直前(システムに戻り値を返す直前、各種終了処理等も終わった後)に
呼び出される関数を作りたいとしたら、スタートアップコードを自作(というかカスタマイズ?)するしかないのでしょうか?
>>396 拡張子が .c にも関わらず C++ で書いてあるソースファイルと、そのコンパイル結果だと思いますが。
.cpp .cc .cxx などにリネームしてみては?あとはメンバ関数ポインタの書式はそれでいいんだっけ?
>>381 | (1<<x) とか & ~(1<<x) みたいに
ビット演算で1ビットしか操作してないのをハケーンしたら
各CPUのビット操作専用命令を
本家に送る前のテストってんなら協力するけど。
>>399 すんません。ありがとうございます。
で、libc 全般に関する質問はこっちで OK ですよね?
もともと終了直前に処理がしたかったのはヒープ管理部分の終了処理が終わった後に
free が呼ばれていたからなのですが、
よく考えたらそれって C ランタイムの終了処理が走ってるって事ですよね?
そこで、Cランタイムの終了処理関係がわかればいい案が浮かぶかもと思ったのですが
「libc 終了処理」などでググってみてもそれっぽいのが出てきません。
何か勘違いしているのでしょうか?検索キーワードの選び方が悪いのでしょうか?
>>402 atexit使って終了処理起動しているとか。
強引にexit(2)呼んで、通常の終了処理を無視すると言うのもあるけど、
Cygwinで通用するかどうかわからんしなあ。
>>403 いや、Cランタイムの終了処理をなくしたいわけじゃないんです。
目的は malloc の置き換えなので、せっかくならデバッグ時には
リークの報告とかも出力したいし、それを考えると
「Cランタイムの終了処理後にヒープの解放をしたい」
という事なのです。
えーと、その後なのですが crtbegin.o/crtend.o ってのはどうなんだろと思い ソースの crtstuff.c と nm の結果からとりあえず ___do_frame_init あたりをリンク時にラップすればいいやと思ったのですが うまくいきません。 ソースに extern "C"{ void __wrap___do_frame_init(void); } ビルド時に -Wl,--wrap,__do_frame_init でいけるかなと思ったんですが、ダメで、実行ファイル内に __wrap___do_frame_init がそのままの名前(当然先頭にもう一個_はついてるでしょうけど)で残っちゃってる状態でした。 で、malloc とかはオブジェクトファイルに定義しておくとライブラリの方じゃなくて オブジェクトファイルに入っている方使ってくれるみたいなので、同じようにすれば大丈夫かな?と思ってやってみたら やっぱり多重定義でリンクできませんでした(オブジェクトファイル同士なのだから当然…でしょうね)。 こんな感じでどうしたらいいのかまたわからなくなってしまいました。 というか、基本に返ってもう一度質問しなおします。 GCC で malloc/free を独自の実装に置き換える場合に 初期化処理と終了処理を行うにはどうしたらいいのでしょう? よろしくお願いします。
>>405 いいかげん帰れ
あのなまずUNIXでためせ
んで成功して
cygwinでだめだったらWindowsのcrt側の問題だろ
UNIXのシステムコール(sbrk)=WIN32APIじゃないんだから
>>402 あとcygwinはlibc(GNU)じゃなくでnewlib(RedHAT)
cygwinのスナップのソースぐらいダウンしてながめてこいよ
>>406 せっかく親切にアドバイスをくれている方に対して失礼なのはわかっているのですが
>あのなまずUNIXでためせ
ここが cygwin のスレでは無い事はわかっています。
が、UNIX のスレでもないですよね。GCC のスレですよね?
>UNIXで(中略)成功してcygwinでだめだったらWindowsのcrt側の問題だろ
>UNIXのシステムコール(sbrk)=WIN32APIじゃないんだから
いや何か誤解されているというか、後半部分の意味がわかりません。
独自実装部分は sbrk ではなく Win32API の VirtualAlloc 使ってますが、
それとこれとは全然関係ないというか…。やはり
>>406 さんが
私の質問を誤解されているとしか思えないのですが。
>>407 別物なのですね、正直知りませんでした。ありがとうございます。
ソースはCVSとかで取ってきたやつではなく cygwin のセットアップで取ってきた物を
何がなんだかわからず推測でファイル名とかを検索してみていたので…。
夏厨の季節か…
gccとなんも関係ないライブラリ依存な話だから
スレ違いだって言ってるのわからない?
死ねよ
>>386
>>409 ごめんなさい。わからないです。
何にも調べずに全部人にきくのが良しとされない文化なのはわかっていますが、
私なりに精一杯調べて、それでもここで聞くのが正しいと思ったのです(それが私の間違いだったとしても)
どこまでがライブラリの話で、どこまでがコンパイラやリンカの話なのか区別のつかない私の無知が悪いのですが、
私の質問の内容が「gccとなんも関係ないライブラリ依存な話」というのがまだ理解できていないので
お気に入りのスレをもう私に汚されないためにも、最後のアドバイスを頂けませんか?
GCC で malloc/free を独自の実装に置き換える場合に
初期化処理と終了処理を行うにはどうしたらいいのでしょう?
この質問に正しく答えてもらう為の質問場所はたとえばどこでしょう?
cygwin のスレですか?私なりの判断ではこれは違うような気がしているのです。
他のスレッドで適切な場所も思いかびません。
苦手な英語を一語一語訳しながら海外のサイト等も見て回りましたが、本当にわからないのです。
よろしくお願いいたします。
#include <stdio.h> //#include <unistd.h> typedef long Align; union header { struct { union header *ptr; unsigned size; }s; Align x; }; typedef union header Header; void *malloc(unsigned nbytes); void free(void *ap); static Header *morecore(unsigned nu); static Header base; static Header *freep=NULL; void *malloc(unsigned nbytes)
{ Header *p,*prevp; Header *morecore(unsigned); unsigned nunits; printf("malloc->%d\n",nbytes); nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1; if((prevp = freep ) == NULL){ base.s.ptr=freep = prevp=&base; base.s.size=0; } for(p=prevp->s.ptr;;prevp=p,p=p->s.ptr){ if(p->s.size >=nunits){ if(p->s.size == nunits) prevp->s.ptr = p->s.ptr; else{ p->s.size -= nunits; p+=p->s.size; p->s.size=nunits; } freep = prevp; return (void *)(p+1); } if( p==freep) if((p = morecore(nunits)) == NULL) return NULL; } }
413 :
デフォルトの名無しさん :03/07/21 05:03
#define NALLOC 1024 static Header *morecore(unsigned nu) { char *cp,*sbrk(int); Header *up; if(nu <NALLOC) nu = NALLOC; cp = sbrk(nu * sizeof(Header)); if(cp == (char *) -1) return NULL; up=(Header *)cp; up->s.size=nu; free((void *)(up+1)); return freep; } void free(void *ap) { Header *bp,*p; printf("free->%p\n",ap); bp=(Header *)ap-1; for(p=freep; !(bp > p && bp < p->s.ptr);p=p->s.ptr) if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; if(bp + bp->s.size == p->s.ptr){ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr;
414 :
デフォルトの名無しさん :03/07/21 05:03
}else bp->s.ptr = p->s.ptr; if( p +p->s.size==bp){ p->s.size+=bp->s.size; p->s.ptr=bp->s.ptr; }else p->s.ptr=bp; freep = p; }
415 :
デフォルトの名無しさん :03/07/21 05:04
| ‖
>>386 ノノノノ -__ fuck!
| ‖ (゚∈゚* ) ─_____ ___
|∧ 从ノ (ミ_(⌒\ ヽ _ ___
( (≡ ̄ ̄ ̄ ̄三\ ⌒ノ ノ)
|(つWつ  ̄ ̄\ ⌒彡) ノ =_
| \つ-つ \,__,ノ ノ
| | ) / / ≡=
416 :
デフォルトの名無しさん :03/07/21 05:05
>>411-415 いえ、実装の話じゃないんです。
初期化処理と終了処理を入れる場所の話なんです。
ちょっと補足、 K&R本 のソースには初期化処理は入ってますが、 終了処理はないですよね?それに初期化は初めて呼び出されたときでもいいのですが 終了処理は適切なタイミングでやらないと駄目ですよね?(悩んでいる理由はこれです)
>>386 #define malloc my_alloc
#define free my_free
つーか目的がわからん・・・ 壮大な勘違いをしてるとしか思えん>386
粘着で馬鹿は絶滅危惧種です。
世間は夏休みか
(゚∀゚)もういっそのことlibcスレ立てようぜ!
あと、いいこと思いついた。 malloc/freeの数の不一致を調べたいだけなら かんky
まだしばらくスレ汚しをする事をお許しください
>>420 目的をちゃんと書いたら正しい所に誘導してもらえますか?
・C++ で書いたヒープ管理クラス(デストラクタにて終了処理あり、確保した資源を OS に返す)があり、
色々な所で色々な生存期間で使っているので、終了処理は必須です。
・上記クラスをつかってmalloc/free/reallocを置き換えたいと思いました。
malloc はグローバルオブジェクトのコンストラクタより前から使われるようなので
ヒープ管理クラスはグローバル変数にはできず、malloc 内の static にし、
(freeからヒープ管理オブジェクトにアクセスできるように)malloc の呼び出し時に
グローバルなヒープ管理オブジェクトへのポインタを設定するようにしました。
(やりたい事1:もっとよい初期化のタイミングがあれば、malloc 呼び出し毎の無駄なポインタへの代入が防げます)
・free は関数内 static なオブジェクトのデストラクタ呼び出しより後にも使われているらしく
現状の方式だと、ヒープ管理オブジェクトが OS へメモリを返した後でも、まだそのメモリが有効だと思い
使っている部分があるようなのです。その為にプログラム終了直前に SIGSEGV で落ちます。
(やりたい事2:ヒープ管理クラスが OS へメモリーを返していいタイミングがあれば、セグメンテーションフォルトを起こさなくできます)
やりたい事2が本命なのですが、貼り付けてもらった K&R本 などの実装では、明示的にOSにメモリを返していません。
この実装ではたしかにこの問題は起こりません。
しかしこの場合はヒープ管理クラスから終了処理をはずすわけにはいかないのです。
(もっとずっと短い生存期間でも使用している為に単純に終了処理を無くすと、OS から確保したメモリをリークしている事になります。)
この為に初期化と終了処理のタイミングを探して
スタートアップルーチン/Cランタイム内の置き換えられそうな関数などを探していたのですが
スレ違いだから出て行けと言われてしまっています。
私には本当にここよりこの質問に適したスレというのがわかりません。
どなたかよろしくお願いいたします。
>>426 C++のクラスでmalloc/freeを置き換えようと思うのが既に間違っているような気がしますか…
アロケータをグローバルに落とすってことか?
>>425 CVSではとっくの昔に3.4に逝ってるんだがなぁ
それが何か
>>429 コンパイラのバグは泣けるので、じっくりデバッグしてほしいけどねえ。
落ちる位ならいいんだけど、嘘のコード吐かれた日には…
>>426 がいってるのはlibstdc++の問題じゃないのか?
C++とは逝ってないだろお前シネヨ
gcc/ld/nm/objdump
の使い方勉強して来い
>>427 実装の詳細なので、C++ のクラスなのは関係ないと思うんです。
(と書くと、デストラクタが実行されるのが問題なんだろと思われるかもしれませんが、
呼び出されないようにする方法自体はあるので、
そうではなく終了処理を行うタイミングが見つけられないのが問題なんです)
>>428 仰られてる中での用語の定義がよくわからないのでなんとも言えないのですが
「メモリアロケーションの為のオブジェクトをグローバル変数にしたい」のではなくて
(繰り返しになりますが)初期化処理と終了処理を行うタイミングが欲しいのです。
>>432 >libstdc++の問題じゃないのか?
どうしてこう思われたのか教えていただけると、質問のしかた等の参考になるので助かります。
>C++とは逝ってないだろお前シネヨ
なんだかこのスレは死ね死ね仰る方が多いようですね^^
あとGCCはGNU Compiler Collectionですよね。UNIXでCコンパイラを使われている方だけが
GCCを使っているというわけではないですよね。
>gcc/ld/nm/objdumpの使い方勉強して来い
勉強不足に関してはご指摘真摯に受け止めることにします。
>>433 ライブラリのmallocまで置き換えたい理由は何だ?
cygwin環境でそれをすることの意義がわからん。
それでもやるなら、
まずcrt0書け。そして起こった問題をひとつずつ潰していけ。
>>434 楽勝ですが何か?
$ objdump -S /lib/crt0.o
/lib/crt0.o: file format pe-i386
Disassembly of section .text:
00000000 <_mainCRTStartup>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: a1 00 00 00 00 mov 0x0,%eax
b: 85 c0 test %eax,%eax
d: 74 01 je 10 <_mainCRTStartup+0x10>
f: cc int3
10: d9 7d fe fnstcw 0xfffffffe(%ebp)
13: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax
17: 25 c0 f0 ff ff and $0xfffff0c0,%eax
1c: 66 89 45 fe mov %ax,0xfffffffe(%ebp)
20: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax
24: 0d 3f 03 00 00 or $0x33f,%eax
29: 66 89 45 fe mov %ax,0xfffffffe(%ebp)
2d: d9 6d fe fldcw 0xfffffffe(%ebp)
30: 83 ec 0c sub $0xc,%esp
33: 68 00 00 00 00 push $0x0
38: e8 00 00 00 00 call 3d <_mainCRTStartup+0x3d>
3d: c9 leave
3e: c3 ret
3f: 90 nop
何か?って煽るようなことじゃないだろ 立場分かってねーな
>>434 >ライブラリのmallocまで置き換えたい理由は何だ?
色々とあるのですが、何か(プログラム上の)問題が起こったときに
ライブラリのmallocまで含めて疑う事が多いので
>まずcrt0書け。
cygwin の crt0 はFPUの設定と DLL 内の cygwin_crt0 の呼び出しだけなので…
(すでに書きましたが、cygwin_crt0からは処理が戻ってこないので…)
ぶっちゃけ言えば「Cランタイムの初期化と終了をのっとって、独自の処理をした後にもともとの初期化と終了処理にバイパスする方法を教えてください」
なのですが。
さすがに cygwin1.dll 全部を書き直せというのは…
馬鹿はほっとけ スレが腐る
実効ファイルの暗号化でもやりたいのか?
>>435 正直、勘弁してください。あなたが私の事を気にくわないのはわかりましたから。
>438 うるさい馬鹿
勘弁してください
>>433 はトリップつけろ そして他のやつはそのトリップを無視ワードにしとけ
それで全て丸く収まる
malloc 置き換え云々の質問をしている者です。 これからトリップつけます。 荒らしを呼んでしまって申し訳ありません。
>>445 よくやった!これで君のレスを見ないで済む
NGNameに追加しました。
↑は偽者です cygwinの実行ファイルはalloca(3)をよんでるようですね なっとくしました スレを汚してすみませんでした
というわけで、改めて質問しなおさせてください。
GCC で malloc/free を独自の実装に置き換える場合に
初期化処理と終了処理を行うにはどうしたらいいのでしょう?
よろしくお願いします。
>>448 私の今までの発言には関数名の後にUNIXのマニュアルの分類みたいの入れてないんですよ。
残念でしたね。UNIX親父さん。
よし、これで◆9ThjVJlmbU確定だな?そうなんだな?OK。◆9ThjVJlmbUOK。よ、いいこと教えてやるから少し大人しくしてくれ。 旨いゆで卯の作り方だ。 まず、生卯を用意する。 普通は鮮度が良い程良いのだが、この調理法では古い卯でも旨くなるのであまり気にしなくて良い。 次に電子レンジに生卯を入れる。この時注意して欲しいのは ●皿を使わず、直にターンテーブルの上に置く。 ●ラップ等で包まず裸のまま入れる。 ●卯は1個より3〜4個置いたほうが旨くなる。 あとは、電子レンジを回して3分程チンするだけだ。(500W時) 実際に茹でてないので厳密には茹で卯とは言えないが、そこはご愛嬌。 今までの卯料理とは段違いの旨さ、ふわふわ感なので是非試してくれ。 因みに食すときは酢醤油をお勧めする
まず俺から、俺はYBBをReachDslで使っていた。 最近親がパソコンを始めたのでルーターで分けて使っていた。 弟もパソコンを始めるらしい、500~600kbpsぐらいなので少々厳しかった それで親が一括してプロバイダー契約してもいいといってたし YBBのモデムレンタル契約改正で踏ん切りがついて解約した。 自分の住んでいる場所は電話線収容局から4.5kmも離れていてADSLに適していないことは 十分解っていたのでBフレッツにしようとした。Bフレッツのサービス提供地域に入っていたが しかし家の近くの電柱にはあの光ケーブルの四角い箱(クロージャ)がぶら下がっていない。 NTTに電話したら3ヶ月ぐらいまたされそうな感じだった。 仕方なく地元ケーブルにした、グローバルIPだし検索してP2P規制の情報もなかったので大丈夫だろ うと方をくくっていた。しかしポート警告の嵐でほとんど出来ない。 おまけに1年以内に解約すると工事費1万円取られる。 気がくるわんばかりだ・・・・
453 :
386 ◆df.Iblvm9w :03/07/22 00:33
まず俺から、俺はGCCをCYGWINで使っていた。 最近親がプログラミングを始めたのでgcc2.9/3.2で分けて使っていた。 弟もパソコンを始めるらしい、gcc3.4ぐらいなので少々厳しかった それで親が一括してDebian契約してもいいといってたし GNUのコンパイラ契約改正で踏ん切りがついて解約した。 自分の住んでいる場所はmallocから4.5kmも離れていてx86FPUに適していないことは 十分解っていたので独自のmallocにしようとした。Redhatのnewlibサービス提供地域に入っていたが しかしAtomakeの近くのスクリプトにはあのperlの*(クロージャ)がぶら下がっていない。 2chに電話したら3ヶ月ぐらいまたされそうな感じだった。 仕方なく地元ケーブルにした、グローバルIPだし検索してP2P規制の情報もなかったので大丈夫だろ うと方をくくっていた。しかしポート警告の嵐でほとんど出来ない。 おまけに1年以内に解約すると工事費1万円取られる。 気がくるわんばかりだ・・・・
何打このクソスレ・・・
あぼーん
あなたもわたしも シージーシー つくるひとうるひと たべるひと たがいにやくだて ありがとう たすけられたり たすけたり じょうずな かいもの シージーシー てかごかたーての かおなじみ やすくて おいしい しなえらびー しらせーられたりしらせたり あなたもわたしも シージーシー つくるひとうるひと たべるひと たがいにやくだて ありがとう たすけられたり たすけたり べんりに つかおう シージーシー あれこれ なやみの ショッピング やすくて ほうふな しなぞろえー おしえーられたりおしえたり
___ クルッ… / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / || ̄ ̄|| <⌒ヽ )) < >>459 はてさて、 | ||__|| < 丿 | どこを縦に読みゃいいんだ? | ̄ ̄\三⊂/ ̄ ̄ ̄/ \___________ | | ( ./ /
あぼーん
あぼーん
464 :
デフォルトの名無しさん :03/07/22 03:27
あぼーん
>>386 1 言ってる意味が全く伝わってない
2 やりたい事も意味不明
3 レスの内容が泥沼過ぎる
処方箋
1 あなたの問題は、あなた個人の問題であり、あなた以外の人は知りません
それを前提に、今までの説明で、その問題が本当に伝わっているのか、レスを見直しましょう
2 多くの問題は、あなた自身のプログラムのミス(バグや方向性)から生まれています
何が問題なのかを1から考え直し、1つ1つ解決して行きましょう
3 あなたのせいで、コレだけスレが荒れてしまいました
意思の疎通が上手く出来ないと、いくら書き込んでも、同じ結果しか生まれません
考えを整理し、要点をしぼってから、書き込むよう心掛けましょう
あぼーん
あぼーん
469 :
デフォルトの名無しさん :03/07/22 09:37
コード晒せ!
>>386 Windows上で、あるDLLの内部で使われてる関数を外部から置き換えたいってことなのか?
ならシステムの仕様上、不可能ってのが答えだが。
少なくともgccとはこれっぱかしも関係がある話には見えない。
cygwin移植! と独り言。
そう、重要なのは、GCCとは何の関係もないということだ>386 とりあえずlibcのソースを見ろと。
386決して馬鹿じゃなさそうだが。。
486の方が断然頭いいよ。。
586のほうが100倍いいよ。。
それなら586の方が。。 #486が何言ってくれるか期待。
かぶった。。鬱。
手間かけたくないなら、 コンストラクタ側は必要になった時点で初期化、 終了処理は atexit で良いと思うけど。。。
>>480 ん? Pentiumは586って言わない?
俺の近所じゃそう呼ぶ習わし。
最近のは686だな。
> #486が何言ってくれるか期待。 CPUのこと言ってるなら、こんなこと書かんと思っただけ。 まあ気にするな。
>>484 Opteron?
あれはK8と呼ぶかなぁ
486 :
デフォルトの名無しさん :03/07/22 22:16
さぁはりきってどーぞ!!
ガ━━(゚Д゚;)━━ソ! ちょっと読んでる間に485書いてたのね…(´・ω・`)ショボーン
まず俺から、俺はYBBをReachDslで使っていた。 最近親がパソコンを始めたのでルーターで分けて使っていた。 弟もパソコンを始めるらしい、500~600kbpsぐらいなので少々厳しかった それで親が一括してプロバイダー契約してもいいといってたし YBBのモデムレンタル契約改正で踏ん切りがついて解約した。 自分の住んでいる場所は電話線収容局から4.5kmも離れていてADSLに適していないことは 十分解っていたのでBフレッツにしようとした。Bフレッツのサービス提供地域に入っていたが しかし家の近くの電柱にはあの光ケーブルの四角い箱(クロージャ)がぶら下がっていない。 NTTに電話したら3ヶ月ぐらいまたされそうな感じだった。 仕方なく地元ケーブルにした、グローバルIPだし検索してP2P規制の情報もなかったので大丈夫だろ うと方をくくっていた。しかしポート警告の嵐でほとんど出来ない。 おまけに1年以内に解約すると工事費1万円取られる。 気がくるわんばかりだ・・・・
586てAMDのやつじゃねえの? うちにあるよ
それ5x86じゃねえの?
クルーソーは何でふか?
>>471 フックするような仕組み等はないか?という質問だったのです。
(cygwin の GCC では)malloc/free などは、同名の関数を定義しておくだけで、DLL ではなくそちらを
使うようにしてくれるみたいなので。
>>473 libc のスレを立てろと仰るのですか?単発でなんでも立てるのは板全体への迷惑な気がします。
私の判断では一番関連性があると思ったのはここなのです。
一番関連が深いのがここであるという判断に間違いはありますか?と何度も聞いているのですが、
「死ね出て行け」以外の返答は頂けておりません。
ご指南の通り newlib のソースについては今回スナップショットを改めてDLして探ってみました。
やはり大変有益でした。ありがとうございます。
>>474 ありがとうございます。
>>479 上の方でも書いていますが atexit で登録では実行されるのが早すぎるのです。
続く
(続き)
で、
>>473 のご指摘にもあるように、昼間仕事サボりながら
cygwin のスナップをDLし、再度いろいろと探ってみました。
初期化処理に関しては cygwin レベルで premain という独自の初期化処理を引っ掛けるスタブ関数が用意されているようだったのですが、
スタブ自体(premain0 - premain3)のオーバーライド(-wrap 指定や同じ名前の関数をオブジェクトに含める)はうまくいかず、
かといって登録されている関数ポインタはどこからどう上書きしていいのか結局わかりませんでした。
終了処理に関しては通常の終了時は必ず(Cランタイムの) exit が呼ばれるようで
そこから _exit (C99の関数?) -> SYS_exit (POSIX API?) -> do_exit(POSIX API?)
のような流れになっているようで(正確に言うと SYS_exit から do_exit へはソース上では追えなかったので予想です)
exit で atexit 登録関数の実行、 _exit でグローバルデストラクタの実行
それ以降は(cygwin自体のもの以外の)終了処理っぽいものをしているようには見えませんでした。
結果からすると私の「Cランタイムの初期化処理と終了処理がどこかにあるはず」という予想自体がハズレだったという事で
それをラップしたりフックしたりする事はそもそも不可能なのだという結論にたどり着きました。
みなさんありがとうございました。
荒らしを呼び起こしてしまった事については、その他の善良な方々に対して深くお詫び申し上げます。すみませんでした。
(´-`).。oO(最後まで傲慢な香具師だったな)
499 :
デフォルトの名無しさん :03/07/24 11:33
gdb の話題をここで書くのもアレですが、スレがないようなので。 Mac OS X に gdb が入ってるんですけど、CUI なんです。 Cygwin だと特に何もしなくても GUI になってくれたんですけど、 Mac OS X では GUI にはならないんでしょうか?
>>499 cygwinの奴はTkをつかったRedhatのinsightがかってに起動するようになってる
gdbは基本的にCUI
dddとか入ってないの?
>>500 なるほど。よく分かりました。
>>501 入ってません。
入れてみようと思います。
お二人とも、ありがとうございました。
gccで ディレクトリを作成する関数ってありますか? WINAPIの _mkdir みたいなやつ
504 :
デフォルトの名無しさん :03/07/30 14:34
age
# nm -g /lib/libc.so.6|grep dir 00125669 R _nl_default_dirname 000d61f0 W chdir 000a9a30 W closedir 000aa920 T dirfd 000e20f0 T dirname 000d6230 W fchdir 000d63e0 T get_current_dir_name 000ab310 T getdirentries 000ab370 T getdirentries64 000d54a0 W mkdir 000a9830 W opendir 000a9aa0 W readdir 000aa930 T readdir64@@GLIBC_2.2 000aaa20 T readdir64@GLIBC_2.1 000aab00 T readdir64_r@@GLIBC_2.2 000aaca0 T readdir64_r@GLIBC_2.1 000a9b80 W readdir_r 000a9d30 T rewinddir 000d7330 W rmdir 000a9e40 T scandir 000aae50 T scandir64@@GLIBC_2.2 000ab050 T scandir64@GLIBC_2.1 000a9db0 T seekdir 000a9e30 T telldir
>>503 BOOL CreateDirectory(
LPCTSTR lpPathName, // directory name
LPSECURITY_ATTRIBUTES lpSecurityAttributes // SD
);
OS は Windows だと仮定してみた。
507 :
デフォルトの名無しさん :03/07/30 17:02
>>506 ちゃんと書いとけばよかった。
OSは、linux です。
MKDIR(2) Linux Programmer's Manual MKDIR(2) 名前 mkdir - ディレクトリを作成する 書式 #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); 説明 mkdir は pathname で示される名前のディレクトリを作成する。 mode には作成されるディレクトリの許可属性(permission)を設定する。この設 定は通常通りプロセスの umask によって修正され、作成されたファイルの許可 属性は (mode & ~umask) となる。 新 し く作成されたディレクトリの所有者はプロセスの実効 UID にセットされ る。新たに作られたディレクトリを保持する親ディレクトリで set group id ビットがセットされていたり、ファイルシステムが BSD のグループセマンティ クスに従ってマウントされている場合には、新しいディレクトリのグループ 所 有 権は親ディレクトリのグループ所有権を継承する (親ディレクトリと同じに なる)。そうでなかった場合の所有グループはプロセスの実効 GID となる。 もし親ディレクトリに set group id ビットがセットされていれば新しく作 成 されるディレクトリにも set group id ビットがセットされる。 返り値 mkdir は成功した場合 0 を、失敗した場合 -1 を返す(失敗した場合 errno が エラーの内容にしたがってセットされる)。
エラー EPERM pathname を含むファイルシステムがディレクトリの作成をサポート し ていない。 EEXIST pathname が既に存在している(ただしそれがディレクトリであるとは限 らない)。 pathname がシンボリックリンクの場合も (その指定先が 存 在するかどうかに関らず)エラーになる。 EFAULT pathname がそのプロセスのアクセス可能なアドレス空間の外を指して いる。 EACCES プロセスが親ディレクトリへの書き込み許可を持たない。 も し く は pathname 中のディレクトリのどれかに検索 (実行) 許可属性が無い。 ENAMETOOLONG pathname が長すぎる。 ENOENT pathname 中のどれかのディレクトリが存在しないか、またはリンク先 の無いシンボリックリンクである。 ENOTDIR pathname 中のディレクトリ部分が実際にはディレクトリでない。 ENOMEM 十分なカーネルメモリが無い。 EROFS pathname が読み出し専用ファイルシステム上のファイルを指 し て い る。 ELOOP パス名 pathname を解決するときに、含まれているシンボリックリンク が多すぎた。 :
ENOSPC pathname を含むデバイスに新たにディレクトリを作成する空 き が 無 い。 もしくはユーザーのディスク quota が使い切られているため、新 たにディレクトリを作成することができない。 準拠 SVr4, POSIX, BSD, SYSV, X/OPEN。SVr4 には他に EMULTIHOP と ENOLINK エ ラー コードについての記述がある。 POSIX.1 には ELOOP についての記述はな い。 NFS を実現しているプロトコルには多くの不備が存在し、それらのいくつか は mkdir に影響を与える。 関連項目 mkdir(1), chmod(2), mknod(2), mount(2), rmdir(2), stat(2), umask(2), unlink(2) Linux 1.0 29 March 1994 MKDIR(2) (END)
,.-ー,,、 /@'ノ_.ヾ) グッジョブ! /C’" _ゞ)) ノ_(( `ー, (;( n ;/ )) ., ヽ:) /ミ) / (( ヽ_ ))// / -、.)⌒' ソ./ ~~~~~~~`jii〉 ~ 〈 ~~~~~~~~~~
>>503 こういうことやって探せばみつかるんだよカスが じぶんでさがせや 1027 ls /usr/include/linux/ 1028 ls /usr/include/sys 1029 grep mkdir /usr/include/sys* 1030 grep dir /usr/include/sys* 1031 grep make /usr/include/sys* 1032 grep make /usr/include/sys/* 1033 grep dir /usr/include/sys/* 1034 mkdir 1035 man 3 mkdir 1036 man mkdir 1037 man 2 mkdir
>>513 `mkdir'という名前が判ってないと探せないね。
>509 どうもありがとうございました。 >513 そういう探し方があるのね 勉強になりますた。
apropos directory
しかもgccとぜんぜん関係ないし。
出ます入ります
519 :
デフォルトの名無しさん :03/08/01 23:05
Vine LinuxのGCCバージョンアップできねーよー!
カエレ
(^^)
誰かMinGWやCygwinのことを詳しくあるホームページだれか教えて下さい。
>>525 グーぐるの日本語ページ
>521 うっ・・・!
GCCのソース(できれば一番新しい)はどこでダウンロードできますか?
>>531 からgcc-20030303.tar.gzをダウンロードしようと思うのですがこれでいいのですか?
>>533 ありがとうございます。
このファイルをダウンロードしたとき解凍するソフトとかもいるのですか?
冷凍なんてされてないから解凍の必要はないと思われ
gccってC99を積極的に使っててちょっとびびった。 K&Rに頑なに拘るBSDとは大違いというか。
>>531 をダウンロードして拡張子をtgzにして解凍したのですが、
これをVC++やBCBでコンパイルできますか?
Windowsかよ。cygwinかmingw使えよ。
>>537 GCCの拡張仕様がC99に取り込まれただけのような気もしますが。
>>538 手を入れないと無理だろう。
>529 の話しているMinGWってのは、俺の使っている gcc とは別物なのか? cygwin の setup.exe でダウンロードできるものじゃ不満か?
>>543 いや別に何でもいいですが、
僕がほしいものはWin用のgccです。
>>545 それ僕持っています。
僕がほしいのはソース・・・
夏だなあ
549 :
デフォルトの名無しさん :03/08/06 00:06
WE LOVE GCC!!
rc4ってなんですか?
Re-implemetation Considered for(4) 「考慮される再実装(案)」 持ってても一般人には意味がないですよ。
リ・コンパイラシステムW アンドル スアミア リチャードギア が開発したプログラム解析プログラム v5はゴミ
>>537 BSDはもはやgcc(拡張)でないとコンパイルできないと思うぞ。
>>553 ということはK&Rスタイルに拘るBSDはフェイクということですか?
それとも、古いバージョンのGCC(C89すらサポートしていない、って
そんなのあるの?!)に対応するためですか?
まあ文化の一つなのかもしれないけど。
>>554 の一行目と最後の行にのみ反応
GNUライセンスを敵視している人、BSDこそが本流だと思っている人の中に、
POSIX, X/Open, ANSIに合わせることを拒絶している人たちがいる。
ただ、その人たちもK&Rなpccを維持することができなくなって、
泣く泣くgccを標準のコンパイラにしている。
ちゃんとしたANSI Cじゃないとコンパイルできないソースが他所様で増えてきたし、
多くのCPUをサポートするのは人手のかかることなので。
大昔のMLを参照のこと。いじょ
>>555 BSD派の人が強い拘りを持っているのは知ってますが、
そういったものが無ければ、当然システムに
一貫性を持たせられないでしょうね。
tendraなんていうBSDライセンスのコンパイラがあるけど、
*BSDはこの先もずっとGCCと一身同体なんですかね。
現状FREENIXのシステム用コンパイラとしてはGCCしか考えられない
感じですが、オルタネイティブ勢にも頑張って欲しいところですねえ。
なーに言ってんだか・・・
3.3.1 ftpサイトにキタ━━━━(゚∀゚)━━━━ッ!!
> BSD派の人が強い拘りを持っているのは知ってますが、
そんなのごく一部。FreeBSD なんかシステムコンパイラをあっさり gcc 3.x
に載せ替えて、しかも C89 ではなく C99 でビルドするようになってるし。
The FreeBSD C99 & POSIX Conformance Project
http://www.freebsd.org/projects/c99/ ただシステムコンパイラとして gcc 以外のものを使うのは、さすがに
難しいだろうなあ。
561 :
デフォルトの名無しさん :03/08/10 08:57
↓漏れこれ嫌だな・・・ The preprocessor no longer accepts multi-line string literals.
>>561 ウチも、インラインアセンブラコードで修正必須なものが山ほど……。
まぁボチボチ手を付けておくか。
↓これ欲しかったんだ。 GCC 3.3.1 automatically places zero-initialized variables in the .bss section on some operating systems. static T* table[ STATIC_MAX ]/* = {0}*/; // bss に逝って欲しい こんなコメント付けなくてよくなるんだなぁ。
>>564 .bssがゼロクリアされないOSって何だろ。組み込み系とか?
OSがやってくれないにしても、バイナリにセクション情報があるのなら、
crt0 あたりで初期化しちまえばいい気もするんだけどなぁ。
>>561 まあ正しい方向に進むわけで。
諦めて直せ。
>>565 OS無しなら普通はcrt0でクリアします。
そうしないとstaticな変数の初期値が不定という恐ろしい状態に…
564とは逆にbssに行ってほしくない場合ってないのかなぁ。
>>565 > GCC 3.3.1 automatically places zero-initialized variables in the .bss section on some operating systems.
は、bssのあるOSでは、「zeroで明示的に初期化」してる場合もbssに置くよ、と言っている。
>>565 は、bssにあるのにzeroで初期化しないOSがある、
と"some"の逆の"other"を考えて誤読している気がする。
"some OS"は、bssのあるOSのこと。
>>568 むしろ、「places 〜 in the .bss」を「initializes variables in the .bss」と勘違いしたと思われ。
あぁぁぁぁ、ちゃんと読んでなくてなんかアホなこと言ってしまった。 int a = 0; が今まで .data に置かれてたのが .bss に置かれるってことなのね。
MinGWと一緒に使うMSYSのこと詳しく載ってるホームページとかありませんか?
572 :
デフォルトの名無しさん :03/08/11 21:55
あぼーん
>>572 >Assigned To: Not yet assigned to anyone
なので、誰も直していないに一票。
なんでFixedになったか謎だけど。
そういやいつからBugzillaになったんだ?
前はGANTSだったような。
>>573 オカ板と間違えましたか?
こちらはプログラム技術板です。
>>577 インストールの時に「今、設定しますか?」見たいなのが出た時に、
y を押して、MinGW の場所を d:/MinGW みたいに入力しておいたら、
とりあえず gcc は使えない?
こっから先は、スレ違いな気分。
こんな事が聞きたいんでは無いような気がしてきますた。
mingw/binにpath張らないとだめだよ
悪いことは言わないから初心者はcygwinにしておきなさい。
>>578 それはやっていますが、
msys.batをクリックしても・・・
クリックしても?
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
apropos directory
tree ssa branchが見ないうちにかなり出来上がってるねえ。
しつもーーん! Linuxのgccで、main関数に引数int argc, char* argv[]を与えたら、 argc値がまるで違うんです。一応Solarisでは問題なくコンパイルできたのに 自宅のVine2.6 Linuxのgcc-2.95.3-2vl22は言うことを聞いてくれません。 引数を4つ入れたのに内部で参照したら-1073744060というのはあんまりですよね。 なんか32bitポインタ値のような値ですねえ。argc, *argv[]がどーも入れ替わって そうに見えるんだなあ。 どなたか、助けて下さい。
>568 コード腫れ。
>>587 コードを見ないと何とも言えんが、Solarisで動いて、Linuxでダメというのは
変数の初期化をしてないだけじゃないのかと思ったり思わなかったり
>>587 Linux板のVineスレか、C言語の初心者用スレ行けよ。
スタックをぶち壊しているに違いない
593 :
煽りイカ(587) :03/08/29 23:05
>589 助言さんくす! 今はWin2000からカキコしてるんで、一度落としてFD差して再起動しなければ なりません。 >590 うっ…! 既に総スカン食らってますだ。 俺、人は良いんだけど口が悪くって、「Red Hot チリ Pepper」にでも 乗り換えろ!って叱られますただ。 >591 ウッ…!鋭いご指摘。 ただ今デバッグ中。年中デバッグ中です。ますますバグが進行している模様。 でも、よく言うヤン。自分で自分がバグってるって自覚している奴ほど実は 正常なんだって。だから俺は正常なんだよぉぉぉぉぉ。 >592 自分の頭の中のスタックはいつも壊れっぱなし。 恥ずかしいので、くれぐれもLinux板のVine Linuxの連中には内緒で、ネ。
594 :
煽りイカ(587) :03/08/29 23:33
どーも、先ほどの初心者「煽りイカ」です。 問題解決しました。 main文の前にstruct宣言が2つほどあったんだけど、こうなってました。 struct example_1{ ... }; struct example_2{ ... } ←';'が抜けていたじゃ、あーーりませんか! main(int argc, char* argv[]) { ... } あー、初心者だなー。いつまでたっても。
>594 回線(ry
594のはGCCのFAQにあったな。 594は練炭焚いて汗だくのまま死ね
>>594 > su -
# apt-get clean
# vi /etc/apt/source.list
# apt-get update
# apt-get -d dist-upgrade
# cd /var/cache/apt/archives/
# rpm -Uvh --nodeps --force *.rpm
後は適当に
# apt-get install gcc gcc-cpp gcc-c++
598 :
煽りイカ(594) :03/08/30 03:22
>595 ??? >596 あんでこれしきのコトで「死ね」と言われにゃならんのだ?お? でもFAQ(ふぁっく)にあったんだ。見てみよっと。 >597 さんくす! よく分からない呪文だけど、打ってみます。 あ、でも、 VineってGCCのバージョンアップができないみたいっす。 VineSeedっていう不安定最新版でやっと他のディストリビューションの 古いのに当たるやつがあって、そいつはapt-getで2時間かけてファイルを 落とした挙句にrpmlibのバージョンが合わなくて(そいつもapt-get update の対象なのに)、結局rpm -Uvhは失敗に終わります。 これならRed Hot チリ pepperにしておくんだった。「デブやん」でもいいけど。 また日を改めてapt-getは試してみます。
>>598 >あんでこれしきのコトで「死ね」と言われにゃならんのだ?お?
これしきのコトもちゃんと対処できないからだろ。
キチガイは放置でよろしこ
Vine擦れでは何人もの人がSeed化方法を解説してくれただろ.なぜそれらをじっくり学ばない? Vine擦れ14から始まってRedhat擦れ,お薦め擦れ.で,ここもか.なにが > 結局rpm -Uvhは失敗に終わります。 だよ.教えを垂れてるつもりか?何人もの人がVine Seedでgcc3.2.3普通に使ってる. Cの初歩勉強したいならM$ WindozeでBCCでも使ってな.KDEはなくてもM$ Officeがある. ( ) ( ) GCC擦れのみなさんすみません、 )::::::::( ):::::::( 連れて帰ります /::::::::::::;\ /::::::::::::; \ // |:::::::::::: l | //´|:::::::::::: l | | | /::::::::::::/| | // /::::::::::::/| | U |::::::::::/ U U |::::::::::/ | | |::::||:::| | | | | |::::||:::| U |::::||::| | ∧∧// |::::||::| | / | | ( ゚д゚ )/ | /.| | // | | | 598 / // | | // | | | /| | // | | // | | // | | // | | U U U U U U
GCC は .NET の CLR 用のコードは吐けないの? さすがに MSIL は嫌かなぁ。
吐けるよ
吐けよゴルァ!
>599, 600, 601 うっ・・・! おまいらのやってるコトはなぁ、心清き汚れを知らない初心者に 対するヒボーチューショーなんだよ。 先輩風気取ってるつもりか?お? 初心者に崇められる人望を持てるようになってからモノ言えや。 ケッ もう一度言う ケッ もう一度言う カーーーーー、ペッ -------> 599 (ぴちゃ) これでおさらばだ。何も学ぶ価値ねーぞ。 謙虚な質問してたつもりが、これじゃ荒しと間違われるヤン。 悪人扱いヤン。そんなのヤンヤン。 ケッ
606 :
デフォルトの名無しさん :03/08/31 02:00
点稼ぎ必死だな
608 :
デフォルトの名無しさん :03/08/31 02:08
>605 まさに逝ってヨシ、だな。永遠の初心者君。
>>605 初心者だったら丁寧に扱うけども初心者とバカは違うからなあ。
バカでも礼儀正しいならまだしも、礼儀知らずなやつは生きてる資格ないね。
無知は救いようがある。が、馬鹿は救いようがない。
>>608 謙虚に学ぶ姿勢のない初心者は、永久に初心者だもんね。
しかも、年期だけは積んでしまうから、態度だけは年功序列的に(?)
でかくなり続けるから、始末に困っちゃう。
でも、605って、どう見てもネタというか受けねらいじゃないの?
[aho@aho aho]$ gcc ./hoge.c -o hoge.exe /cygdrive/d/Temp/ccTmYKal.o(.text+0x84):hoge.c: undefined reference to `_stdscr' /cygdrive/d/Temp/ccTmYKal.o(.text+0x8c):hoge.c: undefined reference to `_wgetch' getch()関数を使いたくてcurses.hをインクルードしたらこんなエラーが出た。 stdsrcやwgetchは使用していないのに、なんでだ?
-lcurses
>>613 getch()を呼んだ瞬間に死ぬ.exeができるところまで持ってこれた。
ありがとう。
#include <stdio.h>
#include <curses.h>
int main(void)
{
char c;
c = getch();
printf("%c\n",c);
return(0);
}
>>613 ぐぐったらinitscrとかendwinとかでてきたから調べてみるね。
ありがとう。
616 :
デフォルトの名無しさん :03/09/02 02:44
>でも、605って、どう見てもネタというか受けねらいじゃないの? はずかしながら、ウケて不覚にもワロタ。
617 :
デフォルトの名無しさん :03/09/02 03:05
Linux板のVineスレに、まだアフォが居座ってるな。
618 :
デフォルトの名無しさん :03/09/04 20:30
クロスコンパイラなるものを知りました。 そこで質問です。 linux 環境でwindowsネイティブの実行ファイルを作成する事もできるのでしょうか? もしできるのならば詳しく説明しているサイトか書籍などを紹介してください。 アドバイスよろしくお願いします。
レスありがとうございます。 できそうですね、GUIは余り興味ないので引き続き自分で調べてみます。
621 :
デフォルトの名無しさん :03/09/08 11:33
sprintf(hoge,"hello\0"); と書いたら、 warning: embedded `\0' in format なんてワーニングがでました。 なんでですか?
formatに'\0'が入ってるから
またC++のABIにバグが見つかったとか。 まあgccの吐き出すコードにバイナリ互換性なんて期待してる人 あんまりいないのかもしれないけど。
624 :
デフォルトの名無しさん :03/09/08 16:19
gccってアセンブラで書かれてるの?
>>624 基本的にC。そんなんtarball開けばすぐに分かるだろ。
じゃあGCCがない環境にGCCを入れることって無理?
C++のライブラリにゃあ互換性は期待してないね Cレベルなら互換性を期待しちゃうけど
>>646 gccは、配布されている状態そのままで、
他のCPUのtarget codeを吐くgcc、
他のCPU上で動くgcc、を作る機構持ってますよ。
コンパイラの本で、ブートストラッピングって言われている手法。
GCC 以外のコンパイラで GCC の C コンパイラをコンパイルする。 出来た C コンパイラでもう一回 GCC をコンパイルする。 出来た C コンパイラでもう一回 GCC をコンパイルして、同じバイナリが出来れば使用可能。
633 :
デフォルトの名無しさん :03/09/09 20:59
#ifdefや#ifなどを取り除いた後のソースを出力して欲しいのですが、 -Eだとマクロが展開されてしまいます。 マクロや#define定義が展開されないように出力する方法を教えて下さい。
boostつかってるお陰でコンパイル速度が死ぬほど遅くて閉口してます。 g++の動作速度が良好なCPU(x86系)ってどれでしょう?買い替えたい。 Linuxでg++-3.3.1です。
SMPマシンって速くなるのかな。 意味なさそう・・
make -j3 すれば通常は意味がありますが、 単一の.cppのコンパイルに20分ほどかかる状況です (templateを使用しているのでうまく分割コンパイルできない)。 よってSMPはやめておこうと思っています。CPU毎のベンチない ですかねえ。
>>634 boostをg++で使用する時のソースが欲しいのですが、
これでちゃんと展開できるんですかね?
ちゃんとできるよ
Linuxの一般的のソフトをコンパイルするのは2.95x系と3.x系のどっちがいいでしょうか? 3.0.4でコンパイルしたら妙にバイナリのサイズが大きい気がするのですが。
>>637 > 単一の.cppのコンパイルに20分ほどかかる状況です
それは極端だな。会社のプロジェクトでも gcc と boost 使ってるけど、
さすがに 1 ファイルで 20 分というのは経験ないぞ。
そういえば non-type template parameter を使ったときに樹状再帰が
発生するとムチャクチャ遅くなるけど、その辺は大丈夫?
642 :
デフォルトの名無しさん :03/09/09 22:28
switchしまくり6000行のファイル見たことあるが、 そのファイルは20分ぐらいかかってたなぁ。 gccでもなければboost使ってるわけでもないんだけど。
>>641 spiritで簡単なスクリプト言語(社内用)の処理をしてるだけなんですけど
ねえ。-O2だと終わりませんね。
non-type template parameter を使ったときの樹状再帰、というのはちと
ピンとこないです。C++ Templates: The Complete Guide かなにかにトピッ
クありますか?あるならウチ帰ってから見てみます。
>>643 あれはboosterが洒落で作ったものなんだから、マジで使うなよ
洒落だったんすか..... (TДT) ソースきぼん。
> spiritで簡単なスクリプト言語(社内用)の処理をしてるだけなんですけど spirit か……あれは、どうしようもないと思うが。 > non-type template parameter を使ったときの樹状再帰、 確か C++ Templates にも記述があったような気がするけど、今、手元に ないので確認とれず。 template <int N> struct Fib { static int const val = Fib<N - 1>::val + Fib<N - 2>::val; }; template <> struct Fib<1> { static int const val = 1; }; template <> struct Fib<2> { static int const val = 1; }; たとえばこんなコードだけど、Fib<10> とか展開すると Fib<9>, Fib<8> の 二つを計算する必要があって、これがそれぞれ Fib<8>, Fib<7> と Fib<7>, Fib<6> を計算……となって Fib<N> の N が増えるに従って指数関数的に計算量が 増えてしまう。 メタプログラミングっぽいコードを書いてると、関連型のタグと 演算子 ? : を使って条件分岐させることがあるけど、てきとーに 書くと本来は線形再帰で間に合うはずが、樹状再帰になりがち。
>646 なるほど。ありがとうございます。 ていうかspiritどうしようもないですか..もう奴に1週間くらい は使っちゃったから引き返しづらいなぁ。対外的に。
今引き返すのがもっとも傷が浅くて済む。時間をかければかけるほど 傷が深くなるぞ。
649 :
デフォルトの名無しさん :03/09/09 23:15
俺も興味持ってたんだけど、具体的にどこが駄目なの?
>>648 etc
コンパイルがクソ重い。
そんだけ?
>>646 Fib<8>::valの評価中にFib<7>::valの評価は行われているのだから、
Fib<9>::valの評価時にFib<7>::valから下に再帰していくことは無い、
・・・なんてことはないの?
質問わかりにくくてごめん。
テンプレートインスタンスのコンパイル結果はキャッシュされないのかってこと、
・・・かな?
653 :
デフォルトの名無しさん :03/09/10 22:32
元質問の、g++が速いCPUは何?ってのはわかる方いません? g++をiccでコンパイルしたいよ。。無理だが。
654 :
デフォルトの名無しさん :03/09/10 22:43
typedef char AA[128]; とかで char A[120]; AA B; の strcmp(AA,B)なんかをするとどうも調子が悪い。 特に 関数の引数にそれらを混在させるとすっごく調子が悪いんですが、 どうしてなのでしょう。 void aa(A a); void aa(A a)
655 :
デフォルトの名無しさん :03/09/10 22:46
すいません654の続きです。 関数aa()をchar xx[100];とかを引数で呼び出すと aa()内のstrcmp()とかで上手く比較できなくなることがあります。 データ内容によるのですが、castすると若干良くなったり、 怪しい動きをします。 なぜなんでしょう。
>>654-655 ハァ?
Cのド初心者スレ行けよ。どうしてもgcc(かlibc)の不具合だと言い張りたいなら
コード貼ってみろや秋厨。
657 :
デフォルトの名無しさん :03/09/10 22:55
>>656 まだ秋休みじゃないけど、なんでそんな言い方なんでしょう?
GCCに関係ないからでしょうね
659 :
デフォルトの名無しさん :03/09/10 22:57
>>659 いいから、コンパイルできるコードを貼ってご覧?
661 :
デフォルトの名無しさん :03/09/10 23:02
ヘダー #define DN_LEN 32 typedef char DN[DN_LEN+1]; #define ClearDN(dn) memset( dn ,'\0',DN_LEN+1) 関数 Boolean GgSearchPos( DNp_Pos,//Pos(IN) long *p_idx//Posテーブルインデックス(OUT) ) { longl_wk;//ワークカウンタ for (l_wk=0; l_wk < *Gl_PosTblNum; l_wk++){ if(strcmp((char *)Gp_PosTbl[l_wk].Pos.PositionDN, (char *)p_Pos) == 0){ *p_idx = l_wk; return YES; } } return NO; } こんな感じです
Gp_PosTbl の定義みせれ。あと、castしないと何かwarningかerrorでるだろ? それ見せれ。
>661 どこがコンパイルできるんだと小一時間
664 :
デフォルトの名無しさん :03/09/10 23:10
>>662 typedef struct {
BooleanInitedFlg;//初期化完了フラグ
DNPositionDN;//PositionDN
#define MAX_QUE_PER_POS 10
longQueueIdx[MAX_QUE_PER_POS];//ACD集計テーブル上のインデックス
#define MAX_AGENT_PER_POS 10
longAgentIdx[MAX_AGENT_PER_POS];//Agentテーブル上のインデックス
longExtIdx;//ポジションテーブル上の対応する
// 内線のインデックス。内線では初期値
longPosIdx;//ポジションテーブル上の対応する
// ポジションのインデックス。ポジションでは初期値
longOutboundACDIdx;//外線発信時使用ACDインデックス
}PositionHdr;
typedef struct
{
PositionHdrPos;//ポジション基本部
PosiotionApprAp[MAX_APPEARANCE];//アピアランス部
}PosTbl;
_GMEM_CLASS_ PosTbl *Gp_PosTbl; //共有メモリPosiotionテーブル先頭ポインタ
キャスト止めたら確かにwarning出たけど、今は環境が手元に無いので
判りません。_
ふむ。すくなくとも頓珍漢な型からchar*にキャストしているわけではなさそうだな。 つーかね、じゃぁ次は、こんな汚いコードではなくて "GCCの不具合で" その現象が 再現する、最小のコードを貼りなさいよ。
>>665 貼ったものはごく一部ですから、これをコンパクトにしてって
調子悪くなる最小セットを探すのはかなり時間がかかります。
また後日。
100%でいいと思います。 大体、Cで、typedef char AA[128]; こんなtypedefやる奴の気が知れません。 んで、やっぱり(char [128])の罠に嵌まって(ry
>>668 >やっぱり(char [128])の罠に嵌まって(ry
この罠ってなんですか?
#include <string.h>
>>668 煽りじゃなくて純粋に質問。
私、画像処理なんかで、typedef unsigned char rgb[3], argb[4]; とか
typedef unsiged char smallpix[16][16]; なんて、時々使うんですけど、
こういう書きかたって、実は何かマズイことが起こるんでしょうか。
必要に応じて、#pragmaでパディングなしを設定などはしてます。
>>671 それらは意味あるデータクラスだと思うが、それと
typedef char AA[128];
なんてのを同列に考える必要もあるまい。
>>671 rgb* p = new rgb;
delete[] p;
と書く羽目になる。
deleteするとき、配列だということを忘れて解放漏れを生じやすいと思う。
674 :
デフォルトの名無しさん :03/09/12 12:31
>>673 > delete[] p;
Cの話だったはずだが…
>>668 > 大体、Cで、typedef char AA[128]; こんなtypedefやる奴の気が知れません。
>>671 >
>>668 > typedef unsiged char smallpix[16][16]; なんて、時々使うんですけど、
つーかC++だとしてもコンパイラが警告してくれない?(見た目は兎も角)
>>673 おお、なるほど、それは確かに間違いの元かも。言われるまで気がつか
なかったです。勉強になります。
たまたま、私は、C++で書くときは、配列をtypedef だけじゃなく、その配列は
class の中にいれるようにしてきたので(typedefした特定の配列型専用に
関数を用意したいから)、そういう、
「typedefで配列であることを隠したせいで、delete を間違えるミス」
というのをしたことは、まだないです。が、気をつける必要はありますね。
(実を言えば、typedef で隠してない、明示的な配列を使っているときに
delete[] と書くべきところで delete と書くミスなら、日常的にやりまくって
いたり・・・)
>>674 Cでmalloc と free をやっているだけなら、大丈夫?
いまだ気になるのは、
> (char [128])の罠
です。なんなのでしょう?
>>676 多次元配列を作ったときに、直感に反する動作をすることはあるね。
#include <stddef.h>
#include <stdio.h>
typedef float VECTOR[4];
typedef VECTOR MATRIX[4];
struct VECTOR2
{
union { float x, y, z, w; float v[4]; };
float& operator[](size_t n) { return v[n]; }
float operator[](size_t n) const { return v[n]; }
};
struct MATRIX2
{
VECTOR2 v[4];
VECTOR2& operator[](size_t n) { return v[n]; }
VECTOR2 const& operator[](size_t n) const { return v[n]; }
};
static void foo(MATRIX m) { printf("%s\n", __PRETTY_FUNCTION__); }
static void foo(VECTOR2* p) { printf("%s\n", __PRETTY_FUNCTION__); }
int
main()
{
MATRIX m; foo(&m[1]);// foo(MATRIX) が呼ばれる (たぶん意図した動作ではない)
MATRIX2 m2; foo(&m2[1]);// foo(VECTOR2*) が呼ばれる (たぶん意図通り)
}
GCCってプリコンパイルできない? C++のコンパイルが遅くなっていくんだけど。
3.4で実装予定。>PCH 待てないならスナップショットでも拾って野良ビルドGo!
>>672 ネーミングを問題にしてるんですか?
私は最初から動きについて聞いてるんですが?
>>680 >672じゃないけど、char*4のカプセル化には賛成、char*128のカプセル化には反対。
#何故だか分からないかな?
683 :
デフォルトの名無しさん :03/09/13 19:42
>>681 扱うデータサイズで区別をつける必要はないから
コード的には同じだと思うよ。
>>683 データサイズが小さいと最適化でレジスタが利用できるってことじゃない?
キャストすりゃいいんじゃないの
687 :
デフォルトの名無しさん :03/09/13 21:08
>>685 それはそうだけど、typedefの目的は中心的概念に名前を付けて
見通しをよくすることではないでしょうか?
相変わらず横柄な態度(笑)
GCCスレで何の話をしてるんだよ
どうしてもgccのバグだということにしたい人が粘着しているだけ。
691 :
デフォルトの名無しさん :03/09/14 05:51
typedefをchar[128]で使っちゃいけない理由はないようですね。
>691 お前一人で作ってるプログラムで使うんなら止めはしない。 思う存分使ってくれ。
693 :
デフォルトの名無しさん :03/09/14 06:15
694 :
デフォルトの名無しさん :03/09/14 08:02
>>690 まともなことが言えないばかりか、読解力もないようですね。
695 :
デフォルトの名無しさん :03/09/14 08:03
>>688 何処がですか?
まあ、答えられないでしょうね
>>691 gcc的には使っていけない理由はないよ
ただ、それをやる人はごく少数なので
複数の人がかかわるプロジェクトでは
そういうコード書かない方がいいという話。
効率がいいわけでもないしね。
>>691 じゃないけど。
> それをやる人はごく少数なので
typedef char AA[4] は多数なの?
結局『typedef char AA[128]の罠』って何?
typedef char AA[128] なんてやってると女の子にモテませんよ
逆に質問、例えば struct charArray { char AA[128]; }; ですむことをわざわざ可読性の悪い形にしたがる理由は?
gccではtypedef char AA[128] としてはならないでFA?
>>700 別にしたいとは思わない。誰もしたいなんて言ってないだろう。
ただtypedef char AA[128] には罠があると言ってるから、それが何なのか知りたいだけ。
俺今までこの話題にノータッチだったんだけど、誰も答え言わないから気になる。
ググってもそんな話題見当たらなかったし。
答え言ってもらえるとすっきりするし、横柄な態度の彼も帰るんじゃない?
そもそもvector<char>使うしな。struct charArrayなんて使わんだろ。
http://www.samba.gr.jp/ml/sugj-tech/htdocs/200106.month/3503.html こんなんがあった。sambaだけど
typedef char fstring[128];
の代わりに
#define FSTRING_LEN 256
typedef char fstring[FSTRING_LEN];
にしてる。
これは128だとまずいから256にしてるってことみたいだけど。
確かにtypedef char AA[128]の罠を避けているようだけど。
で、一体『どういう罠』を避けてるの?
128じゃ足らないとかそんなアホな理由じゃないよな?
長さわからんなら動的に確保すべきだし。
分かった!多分合ってると思う。
typedef char fstring[128];
fstring str;
unsigned char i = 0; // 普通こんなことしねー
while (str[i] != '\0') {
++i;
}
これのことであってるか?<罠
>>700
かなり既出だが・・・ typedef T[N] TA; こーいうことをやると,将来そのプログラムをC++に移植するなり,C++つかった プロジェクトで再利用する時に, TA ta = new TA; ... delete TA;//間違い delete[] TA;//こっちが正解 っていうことになる.
>>705 それは128かどうかは関係ないだろ。何言ってんだか。
普段、Windows系OS上で主にVcを使ったプログラミングしている者です ちょっと、分からないことが出来たので このスレで良いのか分かりませんがみなさんの教えを請いたいと思います 数年前にとあるOSを使わない機器のプログラミングをしました 趣味のレベルなんですが・・・・・ このとき手元によさげなクロスコンパイラがなかったので gccのc言語コンパイラをつかっていました 機器の内部仕様があまり明確でなかったり 初期のテスト段階でcを使ってしまった流れから c言語で無理やりクラスオブジェクトのようなものを構成して 静的配列でインスタンスを用意し、クラスのコピーを生成するといった バカくさい方法をとっていました 最近、このプログラムを少し拡張しようと思いましたが 拡張するにあたって思い切ってnew演算子の使える c++言語で組みなおそうかと思っています が、ここで気になることが出てきました クラスのコピーを作ったり破棄したり繰り返していくうちに いわゆるメモリのフラグメ ンテーションの問題が起きると思うのです 普段は、そういうことはOS側で察知してくれるので 主に「メモリが足りませんエラー」が帰ってきて対策ができます 今回はOSを介さずに直接ハードウエアを操作しているので たとえば論理的には存在するけど物理的に存在しない領域を確保してしまった と、いうような事態が起こり得て、さらにそれを察知することも出来ないと思う のですが
長いっていわれました(;´д⊂) つづき 実際のところgccのc++コンパイラとしては new演算子の話だけではなくメモリの動的な確保の仕組みとして どのように動的なメモリ確保を行うのでしょうか? それともコンパイラが賢く解釈してくれるので わたしの気にしているような問題は起こらないのでしょうか? 追記: 正規の情報理論教育を受けていないので 各単語の使用方法が間違っているかも知れませんが そのあたりは汲んでいただけると幸いです
>>707 ,708
そういう場合、メモリ管理は自分で作ることになっています。
がんばってね。
>>706 そういう話だったのね.勘違いしてた.
漏れは
typedef char AA[4];
これもするべきでは無いと思う.
オレも「罠」がなんなのか気になる。 マナーとか、保守の面から使いたくないのはわかるけど 言語仕様上マズい点があるなら、それはそれで知識として知っとき隊
↓罠と言ってしまった人の弁解
714 :
デフォルトの名無しさん :03/09/14 18:42
GCCはプリコンパイルを導入する気はないの? 遅いよー。
ていうかだな、cppよりg++が遅すぎる罠。 gccしか使わないのならpchで解決だろうが。
可愛い関数ってなんですか?
720は放って置いて上げて下さい
char [128] でも本質的に同じ問題に遭遇するコトが分からない?
>>723 スレの流れ読めてますか?おバカさん。
typedef unsigned char rgb[3];
と
typedef char AA[128];
を同列に考える必要が無い。
⇒typedef char AA[128]”には”罠がある
>>724 で、typedef unsigned char rgb[3]; にはなくて typedef char AA[128]; にだけある
「罠」ってナニ?
>>725 俺に聞くな。
668デフォルトの名無しさんsage03/09/11 04:10
100%でいいと思います。
大体、Cで、typedef char AA[128]; こんなtypedefやる奴の気が知れません。
んで、やっぱり(char [128])の罠に嵌まって(ry
669デフォルトの名無しさんsage03/09/11 07:06
>>668 >やっぱり(char [128])の罠に嵌まって(ry
この罠ってなんですか?
671デフォルトの名無しさんsage03/09/11 20:02
>>668 煽りじゃなくて純粋に質問。
私、画像処理なんかで、typedef unsigned char rgb[3], argb[4]; とか
typedef unsiged char smallpix[16][16]; なんて、時々使うんですけど、
こういう書きかたって、実は何かマズイことが起こるんでしょうか。
必要に応じて、#pragmaでパディングなしを設定などはしてます。
672デフォルトの名無しさんsage03/09/11 23:29
>>671 それらは意味あるデータクラスだと思うが、それと
typedef char AA[128];
なんてのを同列に考える必要もあるまい。
粘着くんは?
>>671 > 私、画像処理なんかで、typedef unsigned char rgb[3], argb[4]; とか
こりゃ本来structとbit feildの領域なんじゃないの?
unsigned charで決めうちなら、それが楽だとは思うけどね。
コンパイラオプション-mcpuによって #ifdef SSE みたいな感じでその命令が使えるかどうか 静的に知る方法があっても良さそうなのですが ぐぐり方が悪いのか見つかりません。 gccでこのようなことはできるのでしょうか? できるなら、どんな名前で定義されているか どのドキュメントを読めば分かるのでしょうか。
>>729 gcc -vでコンパイルすると定義(-Dhoge)が出力されるから、
それで違う部分を見つけて振り分けてみては?
>>729 > できるなら、どんな名前で定義されているか
> どのドキュメントを読めば分かるのでしょうか。
サイト固有の設定はspecファイルに書いてある。在処の調べ方は
>>730 前半については目的が良く分からない。
asm文? それともサポートしている命令によってCのcodeを変える?
asm文だとcc1じゃなくてasの方を調べないとね。
>>730 $ comm -13 <(gcc -E -dM -x c /dev/null|sort) <(gcc -E -dM -x c -mcpu=i686 /dev/null|sort)
#define __tune_i686__ 1
#define __tune_pentiumpro__ 1
>>730-732 アリガトン。
MMXとかSSEとか直接定義してもらうには
-mcpuよりも-marchの方がいいみたいですね。
> 前半については目的が良く分からない。
> asm文? それともサポートしている命令によってCのcodeを変える?
インラインアセンブラとか、
C風呼び出し(_mm_add_pi32()みたいなやつ)とかを使おうと思ってます。
734 :
デフォルトの名無しさん :03/09/18 23:17
gccにlintやらは含まれているのですか?
メモ:便利コマンドライン ・gcc -dumpspecs ・gcc -E -v - < /dev/null
Athlon64対応なMinGW用gcc3.3xバイナリってどこかに転がってませんかね… MSYS上でのビルドはエラー多過ぎで断念しました
gcc-3.4もだんだんいい感じになってきたね
Cygwin上でもconfigureでこけました ./configure --target=x86_64-pc-cygwin ./configure --target=x86_64 それぞれ *** Configuration x86_64-pc-cygwin not supported *** Configuration x86_64-pc-none not supported とのエラーで止まります。まだx86_64のwin32バイナリはサポートしていないようですね…残念 悔しいのでia64に鞍替え
64bit環境だからwin64か・・・
741 :
デフォルトの名無しさん :03/09/26 11:51
初心者でスイマセン皆々様。 C言語初心者なんですがコマンドラインからコンパイルすると gcc : installation problem,cannot exec 'cpp0':Invalid argument と出てコンパイルできません。pathは通したんですが。ほかに何か設定が 必要でしょうか?
>>741 OSは何か、どうやってgccインストールしたのか位は書かなきゃ答え
ようがないよ。
# gccのinstallation problemなんて、B20.1の頃のCygwinで古い環境
# 変数(GCC_PREFIXだったか)設定したまんまの場合でしか見た記憶
# 無いけど
お前さん、make installしたんじゃないだろ。誰かが作って固めた玉を、元の環境とは
違うパスに展開したんじゃないの?configureに与えたprefixと違うところに置く場合、
バイナリにパスが通っているだけじゃ駄目だ。
>>742 の通り、環境変数を設定しろ。確かGCC_EXEC_PREFIX、C_INCLUDE_PATH、
COMPILER_PATH、LIBRARY_PATHだっけかな…バージョンによっても違うかも
しれんけどな。
>>739 LinuxでAMD64で動くものを使ったほうがよくないか?
gcc3.3.xで対応してると思ったが。
741です。 gccと名のつくものすべて消して、もう一回インストールしたら コンパイルできました。 でも、return type of 'main' is not 'int'という警告が出るのですが bccじゃでないので、gccだからですか? void main(void)という書き方が問題ですかね。 教えて厨でスマソ。
>>745 >return type of 'main' is not 'int'
そのものずばり、あんたの問題。
-wつけな(ワラ
>>745 mainがintの値を返さないって言ってるんで、レス中のとおりでんがな。おつかれさん
750 :
デフォルトの名無しさん :03/09/27 02:11
そこで疑問なんだけど int main(int argc,char **argv); っていうプロトタイプ宣言はどこにあるんですか?
言語の問題とツールのことを切り分けて考えられないようなら VBかDelphiやるしかないな。残念だけど。
>>750 find / -type f -name '*.h' -print -exec grep main {} \;
とかしたらどうなる?
757 :
デフォルトの名無しさん :03/09/27 08:41
758 :
デフォルトの名無しさん :03/09/27 09:12
g++ -ansi -pedantic で↓の定義が通るんだけど、拡張だよね? int a[] = {};
>>758 拡張だね。{} が使えるのは要素数が分かってる配列を初期化する場合、並びに
要素を何も持たない struct を初期化する場合だけだと思う。
8 Declarators
8.5.1 Aggregates
4 An array of unknown size initialized with a braceenclosed initializerlist containing n initializers,
where n shall be greater than zero, is defined as having n elements (8.3.4). [Example:
int x[] = { 1, 3, 5 };
declares and initializes x as a onedimensional array that has three elements since no size was
specified and there are three initializers. ] An empty initializer list {} shall not be used as the
initializer for an array of unknown bound.91)
91) The syntax provides for empty initializerlists, but nonetheless C++ does not have zero length arrays.
760 :
デフォルトの名無しさん :03/09/27 10:31
要素・・・メンバのことか。 メンバのない構造体を定義できるの?
>>759 構造体が要素をもつ場合でも使えるんじゃないの?
>>760 もちろん。メタプログラミングだと
struct Empty {};
とかよく使う。
やっぱりC++のみの機能か。
「C++の新機能」と言うと古いC++にはない機能ということになるな・・・
ANSI以前のC++なんてC++じゃないでしょ。あんなの。
だよもん以前のだよもんなんてだよもんじゃないんだよもん。
だよもんはだよもんスレに(・∀・)カエレ!だよもん。
cfrontもAT&Tに(・∀・)カエレ! daemon
3.4のboost regression testが思わしくないねえ。 boostのテストが全てって訳じゃないけど、ひとつの指標として 確立された感じがあるからなあ。メンテナの人もやる気なくなっちゃったかな。。 まあこれ、Changelong見てるだけでもC++の勉強になるね。
まだ正式リリースになってないし、しゃーないんじゃないんかな。 precompiled header とかのサポートで大忙しだろうし > メンテナ。
なんでバージョンアップしてFailが増えてるんだ? あぁ、parserの書換えのせいなのかな?
gccは昔から major version < minor version にならないと 安定しないのさ
よくわからんが、2.6.3が不安定でも
>>774 の命題は仮定が偽になるので全体としては真
777 :
デフォルトの名無しさん :03/10/01 23:28
777
仮定が偽でも全体が真とは限らない
仮定が偽なら全体は真なのは論理学の常識ですが何か
仮性は大丈夫だが真性は医者に行った方がいいぞ
>>776 「gccは昔から major version < minor version にならないと
安定しないのさ」 は
major version >= minor version ならば 不安定
という命題であって
major version < minor version ならば 安定
とは言っていないような気がする。
どうでもいい
>>776 そもそも 774 の書き方が紛らわしいんだよ。
gcc x.y.z
昔は y < z になるまで安定しないと言われてた
これが正解。x < y ではない。
784 :
デフォルトの名無しさん :03/10/02 10:29
ところで、製品のコンパイルに使うとするとどのバージョンがおすすめでつか?
ターゲットにもよるけど、
>>774 理論により2.95.3
漏れの経験上、新しめのでも拡張機能を使わなければまあ問題ないけど。
古いのはCPPが糞という意見もあるし。
gccはunstable/stableとか明示しないのでつか…?
unstableって何だよ
un・stable ━━ a. 不安定な; 【化】(化合物が)分解しやすい. unstable equilibrium 【物】不安定平衡, 不安定な釣合い. un・stable・ness ━━ n. un・stably ━━ ad. 三省堂提供「EXCEED 英和辞典」より
>>784 C なら枯れきった 2.96 とかが良い気がする。C++ だと 2.9x はバグが多いので 3.2 とかに
移行した方が幸せ。
勿論 gcc は全バージョン stable だよ。
当然 windowsにバグなんてないよ。
MinGWって話す時どう発音するの?
みんぐぅ♪
漏れは Cygwin を、ずっとシーワイジーウィンかと思ってたよ。 アホですか、そーですか。
>>786 もともとGNU自体、いわゆる伽藍モデルで開発を進めてたから
基本的に
>>790 のスタンスだったのだろう。
バザールモデル(旧egcs)に切り替わった今現在も、
CVS HEAD以外、リリース=stableだろう。
少なくとも、「そう表明している」ということに関しては。
というかもろに、「伽藍とバザール」必読だな。
>>797 なんか詳しそうな人間が出てきたけど。797 のお勧めは、どれ?
いいや、全然詳しくないっすけど。
とりあえず、Linux(カーネル)が推奨するバージョンが
参考になるのでは。
昔は2.7.2.3、egcsときて今は…やっぱり2.95.3だったか?
カーネルでも最近、GCC3対応が目立ってるのは事実だから、
3.xがそこそこのレベルまで安定しだしたというサインだろう。
あとC++なら、
>>789 の言うとおり最近の方が良いと思われ。
そろそろCでも2.9xは捨てだろ。 いつまでも古いもんにしがみついてんなよ。
802 :
デフォルトの名無しさん :03/10/03 23:03
古いのではない。枯れているのだ。
枯れているのではない。朽ちているのだ。
処理系は OS と違って、古いからセキュリティホールがあるってワケじゃないしなぁ。
スタートアップルーチンにセキュリティホールが存在したりすると 被害甚大だな…とふと思った。
>>805 スレ違いです。ちなみにJavaの場合は
classファイルにはマシンコードは含まれてないわけだけど
.NETは先頭には実行コードがついてるよね。このあたりの
セキュリティーの違いはどうなんでしょう。
そりゃコンパイラ自体と関係ねーだろ。
809 :
デフォルトの名無しさん :03/10/09 00:07
-Weffc++を何とかしてほしい。 つかえそうでつかえない。
-Weffc++が出すwarningを細かく指定できたら便利なのになあ。 チェックが必要なものと、出ても構わないものが混ざるのは不便ナリ
811 :
デフォルトの名無しさん :03/10/10 22:11
cygwinでプロファイリングできん
g++がboostのテスト結果が悪いって話、何度かみたけど 新しいパーサへの移行は、正確なエラーメッセージを出すためには やむをえないらしいね。3.3はしばらくの間使われ続ける ことになるかもしれない。
813 :
デフォルトの名無しさん :03/10/13 15:07
関数に対するweak属性の付加って何の役に立つのですか?
>>813 リンク順を気にしないで乗っ取れるくらいかなあ。
実際役に立った経験は無い。
815 :
デフォルトの名無しさん :03/10/13 20:50
>>814 >>実際役に立った経験は無い。
そうなんですか・・・自分が気になったのは、libc.aの中の
write.oオブジェクトファイルで
$nm -g write.o
U .cerror
00000008 T _write
00000008 W write
の様に、シンボル_writeとそれに対するaliasシンボル
writeをweak属性にしてわざわざ定義しているのか疑問に
思ったからです。
>>815 ISO C的には、libc内の関数で_write()を使ってwrite()をつぶしても
平気にしなくてはいけない。一方、POSIX的にはwrite()が外部シンボル
になってなくてはいけない。両方を満たすにはwrite()と_write()を
別のソースにする手もあるけど、weak symbolを使うのが楽。
libcのように互換性が重要なライブラリを書くのでもないかぎり、
用の無い機能なんじゃないかな。
g++ はどうして遅いんですか?
コンパイル速度がキニナルなら、速いマシンを買いなさい。 今時遅いマシンで開発してるなんて、馬鹿以外の何物でもないです。 と、上司に訴えかけましょう。distccが使えるなら、 速いビルド用サーバーを買ってもらいましょう。
待つには長い、一服するには短い、の中途半端だからよくないんだよ。 速くできないなら486DX-66とかでコンパイルしる! makeて打った後メシ食いにいけるから。
>>819 distcc も悪くないが、個人的には PVM Gmake 一押し。
822 :
デフォルトの名無しさん :03/10/18 08:02
3.3.2 age
>>818 どうしてANSI規格準拠度がもっと高いVC++7.1よりずっと遅いんですか?
VC++はC/C++言語用でWindows OS専門Intel CPU専門COFFバイナリフォーマット専門 etc. GCCは多言語 多OS 多CPU 多バイナリフォーマット etc. コンパイルオプションもそれに応じていっぱいあるし最適化もこまごま多いし、 コンパイルパス(プリプロセス コンパイル アセンブル リンク)をバカ正直に実装してるし、 コンパイル自体よりそういうことに時間がかかってるんじゃないかと思うが。
>>823 マルチランゲージのコンパイラだからどうしても
遅くなる。遅い原因はそれだけじゃないけど。
>>825 >遅い原因はそれだけじゃないけど。
例えば?
>>826 プロセスをやたらたくさん起動する。
ヘッダファイルの解析結果とか、オブジェクトファイルに含まれるシンボル一覧とかを
プロセス内部にキャッシュしておいて使い回すと相当に速くなるんだが、そういう工夫を
一切してないから。
>オブジェクトファイルに含まれるシンボル一覧 gccってリンカだったっけ?
>>828 リンカじゃないけどリンカ起動するし
つーか言いたいこと理解してない?
makefileの書き方にもよるのかもしれないけど、 1ファイルごとにgccを起動しているのも遅い原因じゃないかなあ。
アセンブラのフェーズってVC++にはあるの? clとldしかないような気がするけど。 コンパイラが一気にマシン語吐けばそれで事足りるよね。
Intel専用の利点だな
まあgccは今のままでいいよ。
>>827 最近はCPPとCC1がくっついてるぞ。
でかくなっただけのような気もするけど。
tree-saブランチが入る、3.5はもっと遅くなるんじゃないだろうか? 言語依存のツリーと言語共通のツリーを別々のフェーズにして それぞれ最適化かけるんでしょ?この辺りはあんまり大差ないのかな。
>>834 > 最近はCPPとCC1がくっついてるぞ。
それでも、たとえば file1.cc, file2.cc で stdio.h を #include している場合、二回
stdio.h をパースしている状況は改善できないわけで。
ANSI C の範疇だとヘッダファイルのサイズはたかがしれてるけど、これが
<windows.h> とか C++ STL とかになると洒落にならない。
>>836 それはコンパイル時のプロセス起動が多すぎるという話の流れとは関係ないな。
それにpchは3.4に入るんじゃなかったか?
>>837 pch も1つの解決法だけど、そのあたりのキャッシュを管理するデーモンプロセスを
1つ用意するっつー解決法もある。どっかのコンパイラベンダが実装していたような
気がしたけど。
ふむふむ
GDB6.0なんてものがいつのまにか出てますが、みなさん使ってますか?
TestFirstで組めばデバッガなんて要らないよね
>>840 ローカルパッチ直すのがめんどいのでまだ。
PRしといたバグも直ってなさそうだなあ。
なにか面白そうな機能は追加されてるんでしょうか?
>>841 テストに失敗したことないんですか。スゴー
>>842 http://sources.redhat.com/gdb/download/ANNOUNCEMENT * GNU/Linux's Thread Local Storage (TLS)
GDB now includes support for for the GNU/Linux implementation of
per-thread variables.
* GNU/Linux's Native POSIX Thread Library (NPTL)
GDB's thread code has been updated to work with either the new
GNU/Linux NPTL thread library or the older "LinuxThreads" library.
linux/ia32で使うことに限定すれば目玉機能はこの辺ですかね。
845 :
デフォルトの名無しさん :03/10/22 10:10
GCCの-pipeオプションは、コンパイル時のテンポラリファイルを作るか 作らないかの違いだけで、生成されるバイナリは基本的に同じと考えていいのでしょうか?
RedHat7.3のGCCで、math.hで定義されている関数が使えません。 cosやsqrtなどが。 Win環境のBCCでコンパイルすると問題なく動くプログラムなんですが、 GCCだと上記の関数が定義されていない関数扱いされてエラーになります。 RedHatを再インストールしても同様でした。 信じられないけどこういう仕様なんでしょうか?
エラーメッセージ
RedHatを再インストールしても同様でした。 RedHatを再インストールしても同様でした。 RedHatを再インストールしても同様でした。
それしきの理由でほいほい再インストールするって方が信じられんよ。
lsってファイル表示用のアプリケーションですよね? でも、実行するとエラーが出ます。 もう10回も再インストールしてるんですが全然直りません。 エラーメッセージはbash: sl: command not foundです。 よろしくおねがいします。 --- Windowsのせいで再インストールがくせになってんじゃないのかな。
linuxだと一旦壊すと復旧不能だからだろ。 コマンドラインは否定しないけど、限度がある。
>エラーメッセージはbash: sl: command not foundです。 slかよ
>linuxだと一旦壊すと復旧不能だからだろ。 インストールディスクがあれば、よっぽどのことがない限り復旧できる。
g++でもダメ?
sl入れてないのか?>852
今ちょっと実際に試すことができなくて詳しいエラーメッセージが 確認できないんですが、当たり前のように >定義されていない関数です と表示されてました。 すいません、小出しになっちゃうんですが、確認できたら また書かせてもらいます。 皆さんはmath.h普通に使えてるんですよね。 自分の場合、Linuxメインで何か作業するわけではなく色々な環境で コンパイルを試してみたいと言う理由で、言ってみれば Cを走らせるためのLinuxなんで、そのためには再インストールも惜しみません。 インストールしてほとんど素で使ってますから、 設定に時間取られるわけでもないですし。 こんな使い方してるやつもいるんです。
>>861 仮にhoge.cというファイルをコンパイルするとして
gcc hoge.c -lm
でコンパイルしたらどうなりまっか?
>>861 「-lmつけていませんでした〜」
ってはっきり言えよ
>>861 それにしても10回もサルみたいにやらんでも・・・
ちなみにa.outはウィルス じゃないからね
>>852 > もう10回も再インストールしてるんですが全然直りません。
>>861 > インストールしてほとんど素で使ってますから、
> 設定に時間取られるわけでもないですし。
正直プログラミングは向いてない。
単純反復作業が得意みたいだから、工場ラインにでも。
-lmつけてみました。
・・・できました。
>>864 ,866
俺がやったのは一回だけですよ。
あぁ、ちなみに847=861=867なだけで、他は別人ですが。
-lmつけて100回コンパイルしてみましたが駄目でした・・ 867は偽者です。
どうでもいいけど、Linux板のくだ質レベルの釣りには あんまり反応しないでください。
mingwだと-lmいらないからlinuxに持って行ってはまったことはある
ああ、msvcrtはmath廻りも一緒くたになってるからな。
すみません、普段gccもLinuxも使わない初心者なんですが… Cygwin上のgccでx86用Linuxのバイナリって出力できるんですか?
できません。クロスコンパイラとしてGCCをビルドしなければなりません。
できます。ただしクロスコンパイラとしてGCCをビルドしなければなりません。
…初心者なんでgccのコンパイルの仕方がわかりません。 GNUなサイトからソース取って来て、 ./configure --target=i386-pc-linux とかやるらしいことは判ったのですが、なんやら良くわからないことが多いので。 linux上でcygwin用バイナリの作成を解説しているサイトはいくつか見つかったのですが。 なにか知ってる方は教えていただきたいのですが…。
普通のgccがコンパイル出来るようになってから、 挑戦して下さい。
CygwinのGCCよりMinGWというGCC系コンパイラを使ったらどう? 昔使っていたがクロスコンパイルとかについては忘れてしまった。
879 :
デフォルトの名無しさん :03/10/30 22:40
binutil とか glibc とかもクロス開発用のを入れる必要があります
>>873 どっからかバイナリ探して持ってきた方が早いのでは?
>>879 むしろ Linux マシンを一台用意する方が早いと思う。
>>880 いや、デュアルブートにしてるんですけどね。
基本的にWEB作成をWinでやってるんですけど、Webサーバで走らせるプログラムを
コンパイルするのに、毎回ブートしなおすのも面倒で…。
ちなみに現在マトモに稼動するマシンは一台しか所持してませんし。
仕方なく現状ではSSHで大学に繋いでそこでコンパイルしてますけど、それも面倒。
Windows上でLinux用のバイナリが作れればそれが一番楽なんですけど。
>>879 binutilは正常にコンパイルできた様子。glibcとgccに現在挑戦中。
>>881 ライブラリとヘッダファイルは、linux マシンからコピーしてきた方が良いぞ。ターゲット環境と
バージョン違ったりすると、何かとやっかいだし。
>>882 貴重な助言に感謝。もうちょい研究してみます。とりあえずage
WEB作成とやらをLinuxでやればいいだけなんじゃ?
Linux でやった方がいいと思うけどね。
エディタが使えないユーザーそらもいるだろう。 そういう人のためにもsambaなどがあったりする。
これ以上はスレ違いってことでファイナルアンサー?
モバイル版のLinux Zaurus開発スレにいくと、 Linux Zaurusのsoftwareのクロスコンパイル on WinのURLを見つけることができる。
cross-gccでの質問です。 コマンドラインからxxx-elf-gccを実行させるとリンカスクリプトのパスを 識別してくれるのに、Makefileの中からだと指定したリンカスクリプトを 見つけられないのは、どこの設定をどう直せばいいんでしょうか? Guruの方々、お導きを…
どういう風に作られて、どういう風にインストールされえているかも分からない。
しかも、状況を勝手に「リンカスクリプトを見つけられない」と決めつけてそれ以外の
情報を出さない…
>>892 が求めているのは、guruではなく神。それも2chに時々出てくる
ような安い奴じゃなくて本物。
>>892 わたしは神だ。
設定を直してやるからIPアドレスとユーザ名とパスワードを晒しなさい。
>>894 IP:192.168.0.77
USER: kami
PASSWD: kourin
よろしくお願いしますm(__)m
>>895 おいこらっ!俺のIP勝手に使うんじゃねーよ!
さっさと直せ!
なんど試してもログインできないと思ったら IPコンフリクトかよ
>>896 ,897
スミマセン、なんか最近ネットワークの調子が悪いと思ってたらやっぱりコンフリクトしてましたか。
というわけで、
IP:192.168.0.55
USER: kamikourin
PASSWD: kita----
にしました。何卒よろしくお願いしますm(__)m
>>899 みたいな空気読めない嫌われ者ってクラスに一人はいるよねー。
>>900 みたいな自分が面白いこと言ってると思ってるツマンナイ奴も必ず一人はいるよね〜
897=900
>>898 まだログインできねーよ
ネットワークの設定どこかミスってねーか?
>>904 パスワードまちがってない?
最後の棒線は片仮名の伸ばし棒だよ
まだ引っ張るの?
908 :
デフォルトの名無しさん :03/11/06 16:55
gcc -E -x c-header と cpp では何が違うんでしょうか?全く同じなのかな?
909 :
デフォルトの名無しさん :03/11/06 16:56
cpp以外のプリプロセッサを使うように設定されていたら
#defineの内容が違わない? gccはいろいろと"-Dほげ"で渡すから。
>>911 え?どういうことですか?
-D__XXX__っていう形式はcppへのオプションではないの?
gccがcppを呼び出すときには-Dオプションをいくつか つけてるから、cppを直接使うときには気をつけろって ことだろ。
>>912 spec読んでみるとか。
gcc -v -Eしてみるとか。
ちょっとお聞きしたいのですが Win版Mingw使ってoggしようと思ってるんだけどコンパイルすると c:/mingw/bin/../lib/gcc-lib/mingw32/3.2.3/../../../libvorbisfile.a(vorbisfile.o.b)(.text+0xcd):vorbisfile.c: undefined reference to `ogg_page_serialno' c:/mingw/bin/../lib/gcc-lib/mingw32/3.2.3/../../../libvorbisfile.a(vorbisfile.o.b)(.text+0x16b):vorbisfile.c: undefined reference to `ogg_page_serialno' ... 見たいな感じで怒られるんだけど-lで何を指定すればいいですか?
917 :
デフォルトの名無しさん :03/11/12 19:28
情報が不足しているのでとりあえず1.0のVC用プロジェクトファイルから Makefileを作成してDLLをビルドしようとするならvorbis.dllのビルドには ogg.dllのインポートライブラリogg.libが必要なのでMakefile内のLIBSに-loggが あるのを確認してかつLDFLAGSに-L(ogg.libのあるディレクトリ)が必要。 同様にvorbisenc.dllとvorbisfile.dllにはogg.libに加えてvorbis.libも リンクする必要があります。 こちらはgccのSSEビルトイン関数でvorbisの高速化をやっているけど gcc3.2.3では注意しないとSSEの16Byteアラインメント例外になるコードを 吐くのでgcc3.3.1を使用しています。
こんな感じですか? gcc -mwindows -mno-cygwin -L/usr/local/lib -o hoge.exe hoge.o -logg -lvorbis -lvorbisfile C:/msys/1.0/local/lib/libvorbisfile.a(vorbisfile.o.b)(.text+0xcd):vorbisfile.c: undefined reference to `ogg_page_serialno' C:/msys/1.0/local/lib/libvorbisfile.a(vorbisfile.o.b)(.text+0x16b):vorbisfile.c: undefined reference to `ogg_page_serialno' ... ってまたエラーだよぉ(´Д⊂グスン
919 :
デフォルトの名無しさん :03/11/12 21:56
>gcc -mwindows -mno-cygwin -L/usr/local/lib -o hoge.exe hoge.o -logg -lvorbis -lvorbisfile -lvorbisfile -lvorbis -logg の順でやってみてください。 それでもだめなら/usr/local/lib/ogg.aのようにフルパスのライブラリ名を追加して gcc -mwindows -mno-cygwin -o hoge.exe hoge.o /usr/local/lib/vorbisfile.a /usr/local/lib/vorbis.a /usr/local/lib/ogg.a のようにやってみてください。
>-lvorbisfile -lvorbis -logg この順番にしたら問題なくコンパイルできますた、さんくす。
WindowsXP上でgccを使ってwinsockを使用したコードを書いてみたのですが、 gdbでデバッグするとgethostbyname()を呼ぶとなにやらエラーが出て プログラムの実行を継続できなくなります。 デバッグせずに実行する分には問題なく動作し、gethostbyname()の結果も正常に返ってきています。 また、別のPCのWindows2000上でデバッグした場合は正常に動作していてどこが悪いのか分からないのです。 cygwinでもMinGWでも同じ結果になりました。 そのとき出たメッセージの内容はこんな感じでした。 >Program received signal SIGTRAP, Trace/breakpoint trap. >0x7801b282 in RpcRaiseException () from C:\WINDOWS\system32\rpcrt4.dll >(gdb) どこがまずいのでしょうか?
gdbが悪い XPで開発やるなってこと
そうすると、gdb以外でデバッグする手段はないのでしょうか?
てか、dllの中身をgdbで見たいのかよ?
dllの中身は見えなくて、自分の書いたソースの部分だけデバッグできればいいのですが。 そのつもりでやったのにデバッグするとapiの呼び出す部分の挙動が変わってデバッグできないのです。
926 :
デフォルトの名無しさん :03/11/15 12:53
#include <iostream.h> int main(void) { int x, y; cout << "xを入力してください:"; cin >>x; cout << "yを入力してください:"; cin >>y; cout << "x-yは" << x - y << "です。\n"; return (0); } というプログラムを走らせたときに、わざと xを入力してください:3.5 と入れると yを入力してください:x-yは-1628374585です。 と表示され、「yを入力してください:」の入力を受け付けてくれません。 int x, y; を double x, y; にすると起こりません。 何故このような現象が起こるのでしょうか?
>>926 入力して "3.5" を与えると cin >> x の段階では '.' の直前までを切り出して x に値を設定する.
その後の cin >> y の段階で,まだ ".5" が残っているから,入力待ちが発生せずに,そのまま
".5" を y に設定しようとする.
実際問題として iostream の入力はイマイチだから捨てておけ.行単位で入力を持ってきて,
それを自前で 1 文字ずつ見ながら値を切り出した方が良い.
928 :
デフォルトの名無しさん :03/11/15 13:12
わかりました。有難うございました。 .5 は . としか認識されていないようでした。 . が 1628374588 に化けているようです。
930 :
デフォルトの名無しさん :03/11/15 17:48
スレ違いだが、 テンプレートの中でバグ埋め込んだらお終いじゃねえ? デバッグ死ねるよな?
うむ。死ねる。
スレ違いだが、 コピペの中でバグ埋め込んだらお終いじゃねえ? デバッグ死ねるよな?
933 :
デフォルトの名無しさん :03/11/16 23:27
gdbのデバッグ対象のプログラムにコマンドオプションを与えることは できないのでしょうか?
>>934 ありがとうございます!!!
その一言を求めて2時間Webをさまよっておりました・・・はぁ
x86のgcc 3.3.3でこんなプログラムを書いてコンパイルしてみました。 #include <stdio.h> void foo(int i, char c, int j) { printf("&i=%x\n", &i); printf("&c=%x\n", &c); printf("&j=%x\n", &j); } int main(void) { foo(1, 'a', 2); return 0; } すると > ./giko &i=bfbff458 &c=bfbff44f &j=bfbff460 という結果になり、cだけ変です。 (つづきます)
(つづきです) アセンブリソースを吐かせると foo: pushl %ebp movl %esp, %ebp subl $24, %esp movl 12(%ebp), %eax movb %al, -1(%ebp) leal 8(%ebp), %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf leal -1(%ebp), %eax movl %eax, 4(%esp) movl $.LC1, (%esp) call printf leal 16(%ebp), %eax movl %eax, 4(%esp) movl $.LC2, (%esp) call printf movl %ebp, %esp popl %ebp ret (gcc 3.3.3で、-march=pentium4をつけた例。つけなくてもcについての事情は同じです) となり、1(%ebp)に一旦コピーして、それをcとして使っているようです。 しかし12(%ebp)を直接使っても支障はないのに、 なぜわざわざこうしているのでしょうか? (支障ないのは、cの値を表示させるprintfを加えたもののアセンブリソースを 手で編集して試し、確認しました)
940 :
デフォルトの名無しさん :03/11/17 12:41
書き間違いを発見してしまいました。 × 1(%ebp)に一旦コピーして ○ -1(%ebp)に一旦コピーして あげるのを忘れていたのでついでにあげます。
>>938-940 引数はintで渡されるから、それをcharにキャストしてるんでは?
-O0ならそんなものだろう。
>>941 いや、-O3でもこのキャストはするみたいだな。
消せそうなもんだが。
Cの文字定数はint型なのよね。
そんなことは百も承知だが、エンディアンを考慮してオフセットさせれば、
一度コピーする必要はないんじゃないかってのが、
>>938-942 の流れ。
>>944 VC++ 7.1 だとコピーしてないね.
>>942 printfに渡さなければ、コピーしないようだ。
可変長引数の時だけ特別扱いになるのかな?
948 :
デフォルトの名無しさん :03/11/24 00:44
gcc3.3.1ってバギー?(Mingw32) int main() { int i; for (i = 0; i < 8; i++) { printf("%ld\n", (long)powl((long double)10.0, (long double)i)); } } 結果: 30720 24576 8448 6432 4384 2401 353 14689 変!
>>948 int main() {
int i;
long l;
for (i = 0; i < 8; i++) {
l= (long)powl((long double)10.0, (long double)i);
printf("%ld\n",l);
}
}
950 :
デフォルトの名無しさん :03/11/24 01:00
>>949 結果同じ。とういか、948のソースはgcc2.95/VC6/BCC5.6ならば
1, 10, 100, 1000...とちゃんと出るノダ。
gcc3.3.1は地雷くさい。
math.hをincludeしてないんちゃうか。
してます。補足すると、powlが異常でpowは何とも無いです。
math.hをincludeしたら正しくでるぞ。 includeを外したら948と同じになった。
>>948 試してみたが、ちゃんと出たぞ。
C:\hoge>gcc --version
gcc (GCC) 3.3.1 (mingw special 20030804-1)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\hoge>gcc -o foo foo.c -lm
C:\hoge>foo
1
10
100
1000
10000
100000
1000000
10000000
-ansi をつけてみてちょ。
ダメ。 ソース: #include <math.h> #include <stdio.h> int main() { int i; for (i = 0; i < 8; i++) { printf("%ld\n", (long)powl((long double)10.0, (long double)i)); } } C>gcc -ansi -o check2.exe check2.c C>check2 30720 24576 8448 6432 4384 2401 353 14689
見てるmath.hが食い違ってるとか。
>>957 #include <...> search starts here:
C:/GCC/include
C:/GCC/lib/gcc-lib/mingw32/3.3.1/include
End of search list.
lodprf32で見るとmsvcrt使ってるんだけどlong doubleのサイズが
MSVCとgccで違うんだよね。何で動くのか謎だし、ちと怖い。
単にgccのconfigureをしそこなってるだけじゃないかと小一時間(r
>>959 Winユーザーがバイナリあるのにわざわざconfigureなんかするかよボケ。
>>958 mingwのdouble周りはバグだらけだぞ。
floatまでにしとけ。
コマンドラインオプション変えもしないでうだうだ言ってるだけだろしねや
gccの--enable-mbcharってちゃんと使えてる人いる?
>>962 3.2くらいの時試しただけだが、問題なかった。
ちなみに文字/文字列リテラルの表現はUCS-2になったと記憶。
たまにMulti Byte Stringになると勘違いしている人がいる。
そっか。 ucs2になるのは見当ついているんだが、 なぜか日本語文字がみんな\200\201になるんだよな。 もうちょっと試してみる。サンクス。
>>958 MinGW使う限り、msvcrt.dllのdoubleが8バイトという呪縛からは
逃れられない。STLportを入れてビルドしても同じ。
#include <iostream>
#include <cstdio>
#include <cfloat>
int main()
{
long double l = 123.456, m, n;
m = n = l;
scanf("%Lf", &m);
m = m + 1.0;
std::printf("%Lf\n", m);
std::cout << "sizeof long double = " << sizeof(long double) << std::endl;
std::cout << l << std::endl;
std::printf("%Lf\n", LDBL_MAX / 10);
std::printf("%Lf\n", l);
}
出力(MinGW gcc 3.3.1 + STLport4.6) -2.000000 sizeof long double = 12 123.456 -92559631349317831000000000000000000000000000000000000000000000.000000 -6416663311523673700000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000.000000
STLportのiostreamを使うと若干結果が異なる。 #include <iostream> #include <iomanip> #include <limits> int main() { long double l = 123.456, m, n; m = n = l; std::cin >> m; m = m + 1.0; std::cout << std::setprecision(20) << m << std::endl; std::cout << "sizeof long double = " << sizeof(long double) << std::endl; std::cout << l << std::endl; std::cout << std::numeric_limits<long double>::max() / 10 << std::endl; }
出力結果 2 sizeof long double = 12 123.456 inf gccの内部では恐らくlong doubleは正しく扱われているのであろうが (10バイト、12バイトは多分アラインのため)入出力がおかしい。
970 :
デフォルトの名無しさん :03/11/29 15:37
gcc3.3 で std::ios_base::fmtflags は使えるのですが gcc2.95.3 では使えません。 両方のコンパイラで使えるクラスを教えて頂けないでしょうか?
gcc2.9xのg++は捨てろ。
972 :
デフォルトの名無しさん :03/12/02 07:43
うぶQですまん。 なんか、うちが使ってる、gnu make と gcc / g++ が日本語のエラーを出すのでキモいのだが。 英語でエラー/警告を出す方法ねぇですか? オプションを発見できんかったの。 だれかマシンにgcc3.xをいれたよーで・・・。環境はVine Linuxで、bash使ってます。
>>972 locale変えれば良いんじゃないだろうか
$ export LANG=C
とか
974 :
デフォルトの名無しさん :03/12/02 07:48
>>973 サンキュです。試してみます。bashって書いといて良かった(^^)
LC_ALL=Cの方が良い。
>>973 >>975 感謝。両方試して、両方とも英語になりました。
うちの環境ではLC_ALLのほうは、設定されていないようなので、
理解するまではLANGで設定することにします。
そうして、alias登録しようとして、.bashrcを開いたら、
あらかじめ、こんなんありました。
alias eng='LANG=C LANGUAGE=C LC_ALL=C'
お手数おかけして申し訳ないです。
978 :
デフォルトの名無しさん :03/12/15 15:51
次の事をcygwinで実行したいんですが、エラーが出てしまいます。 文法間違ってますか? ./configure --target=h8300-hms-coff --prefix=/usr/local/h8
誤爆です すいません。
980 :
デフォルトの名無しさん :03/12/27 02:14
gccでのコンパイルとはどうやれは良いんでしょうか。
gcc [ option | filename ] ...
982 :
デフォルトの名無しさん :03/12/27 02:28
gccでレジスタに保存されている値を取得したいのですが、 どのような関数を使用すればよいのか分かりません。 レジスタ値を取得する関数はどのようなものがあるのでしょうか? 以上、宜しくお願い致します。
asm( ・・・ );
>>982 その問いの一般的な答えとしては、「ない」でいいのだろうか…
何がやりたいんだ?自分の目的を正しく理解した上での質問か疑わしい。
>>983 ,984,985
初心者ですみません・・・。
"初めて読む486"より
DOSでは以下のように取得できるらしいのですが、
#include <stdio.h>
#include <dos.h>
int
main ( int argc, char* argv[] ){
struct SREGS sreg;
segread(&sreg);
printf("cs:%04X ds:%04X es:%04X ss:%04X \n",sreg.cs, sreg.ds, sreg.es, sreg.ss);
return 0;
}
環境が無いのでLinuxでやってみようと思いまして・・・。
宜しくお願い致します。
987 :
デフォルトの名無しさん :03/12/27 03:34
gccでのコンパイルの仕方について、 詳しく一から教えて頂けないでしょうか。 色々ぐぐってみたのですが、 みれといった使用方等が載っているサイトはなかったので… ご教授下さい、宜しくお願い致します。
GCCは文法が違うので「はじめて…」のソースはコンパイルできない。 これ以上は他のスレでどうぞ。
>>987 gmakeを導入することが作法。直接gccを起動してはダメ。
Makefileは必ずしも書く必要はない。
make 実行ファイル名
Cコンパイラを複数バージョン入れたときに理由が分かる。
>>990 お、出来ました!
でもLinuxでもやってみたいんですよね・・・。
なんでMS-DOSが使いにくいので。 cygwinでlsic.batを実行できないのかなぁ・・・。
ps)
時々あなた騙されてますよ?って表示されて書き込みできないのは何故なんでしょうか?
992 :
デフォルトの名無しさん :03/12/27 09:02
レジスタの値を得てどうするのさ? DOSのときはINT21H呼ぶのによくつかってたけど じゃなきゃ別に使いみちないような。
何の意味あるのか分からんが… ---- test.c ---- #include <stdio.h> void getsreg( unsigned int reg[4]); unsigned int sreg[4]; void main( void) { getsreg( sreg); printf("cs:%04X ds:%04X es:%04X ss:%04X \n", sreg[0],sreg[1],sreg[2],sreg[3]); } ---- test.c ---- ---- getsreg.s ---- .text .globl _getsreg .type _getsreg,@function _getsreg: movl 4(%esp),%eax movl %cs,(%eax) movl %ds,4(%eax) movl %es,8(%eax) movl %ss,12(%eax) ret ---- getsreg.s ---- gcc -O -o test test.c getsreg.s これで良かったかな…
995 :
デフォルトの名無しさん :03/12/27 11:57
記念カキコ v(^-^*)
そもそもLinuxがプロテクトモードで(略 ってツッコミが入らないな…
そのツッコミもどうかと思うが…
G
C
1000 :
デフォルトの名無しさん :03/12/28 19:56
C
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。