2get
4 :
デフォルトの名無しさん :2007/10/17(水) 11:28:31
x86です。 double d = 0.3; int i; i = d * 1000; とすると i=299になります。 d = d * 1000; i = d; とするとi=300になります。 Macのgccで試したら300になるので生成したコードを調べると SSE2インストラクションを使ってました。試しに-msse2でコンパイルすると両方とも300に なりました。 gccは3.2.2, 3.3.5, 4.1.1と試しましたが全部同じです。 manに書かれている以下の文が関係しているのでしょうか? ... -msse2 ... The resulting code should be considerably faster in the major- ity of cases and avoid the numerical instability problems of 387 code, この問題をどこか詳しく説明している文書はありますでしょうか?
x86は浮動小数点数レジスタが80ビットあり、演算はこの大きさで行われる メモリに書き戻されるタイミングで64ビットに切り捨てられるのだが、 コンパイラの最適化の具合によって メモリに書き戻されるタイミングが変わり、計算結果が変わることがある
floatだと300になるんだよなぁ。
最初の方で
double d = 2.99999999999999988897769753748434595763683319092e-1;
float f = 3.00000011920928955078125e-1;
に変換されていた。
-O0だとハードウェアが使うそのままの形で渡すから、マシン依存ってことかな?
-O2だとmsse2じゃなくても300になった。
http://gcc.gnu.org/bugs.html#known だね。
gccはrtlとか出てきたらよく分からんなぁ。GIMPLEはわかりやすいんだが。。。
GCC用のソースをVCでコンパイルできるようにしてたときにちょっと引っかかったんだけど、 構造体の初期化でメンバ名を指定できるのと、その他の初期値を指定できるなんて 初めて見たよ。 たしかに便利っちゃぁ便利だけど...
全然普及しないC99
9 :
4 :2007/10/17(水) 19:41:08
>>5 >>6 大変参考になりました。 ありがとうございます!
してないよ
12 :
デフォルトの名無しさん :2007/10/18(木) 16:55:33
低反発枕が凄い硬くて反発力が激しいのですが何とかなりませんか。
知るか
>>7 designated Initializerか
>>8 にもあるけどC99で取り入れられてるな
16 :
デフォルトの名無しさん :2007/10/20(土) 08:33:01
max-inline-insns-singleはどのようなときに設定するものなのでしょうか?
>>6 いや、0.3=3/10は2進数では無限小数になって丸め誤差が出ているだけでは?
0.3 = 0.10011001100110011001100…
19 :
デフォルトの名無しさん :2007/10/25(木) 06:16:18
gccのプリプロセッサが、ヘッダファイルをどのディレクトリから探しているのか、探している様子を 画面表示するオプションは無いでしょうか? gccの-iprefixオプションを使うと、途端にいくつかの標準ヘッダが見付からなくなる現象で悩んでます。
-vじゃだめなの?
コード生成以後もいろいろ大変なんだろうけど、 C++やJavaみたいに、言語規格自体が大きくて、 しょっちゅう変更される言語も含まれるから、 リリースがどんどん重くなりそうだね。 libstdc++なんか、言語処理系のバージョンとの関係が切り放せないし。
23 :
デフォルトの名無しさん :2007/10/27(土) 22:51:53
C++は変更が2009年までに本当に終わるのかどうかが心配されているわけだが。。。
24 :
デフォルトの名無しさん :2007/10/27(土) 22:55:55
gcc -gと-ggdbと-g3の違いは何でしょうか。gcc-4.1.2です。
デバッグ情報をどれだけ入れるかの違い。
26 :
デフォルトの名無しさん :2007/10/28(日) 01:33:24
もう少し具体的に。 -g3のマクロ云々はいいので、-gと-ggdbだけでも。
gcc -g はmanで詳細が調べられる gcc -ggdbはmanで詳細が調べられる gcc -g3はmanで詳細が調べられる これぐらいかな違いは。
manにもinfoにも載ってないよ。
29 :
デフォルトの名無しさん :2007/10/28(日) 05:58:40
構造体のパックってどうやるんですか
パックしたい構造体に#pragma pack(1)を使う
__attribute__((packed)) は?
今時、構造体のパックして何するの?
お肌にいい
>>33 余計なalignmentが入るのを防ぐ。
最初にデータ構造ありき、な時は必要でしょ。
ファイルフォーマットとかパケットの構造体作る時とか。
そういうわけだから、今でも要るところには要る。
アライメント違反でSIGBUSするCPUの場合はどうするの?
>>38 ずっと前に、コンパイラがバイト単位での読み書きに翻訳してくれたりした覚えが
あるんだけど、今考えるとメンバ単体をポインタ経由でアクセスしたら死にそう。
OSのカーネルがやってくれる場合もあるな。 でも、OSもコンパイラも面倒見てくれない環境もあるべ。 自分でバイト単位に書き込むのか?
>>40 だれも面倒見てくれないんなら自分でやればいいだろ。
>>40 trapで落ちてからか〜、大昔からあるテクニックだけど今時のマシンでやったらstallしまくりでいやげだなぁ。
softfloatとかも便利だけど鈍いよね。
43 :
デフォルトの名無しさん :2007/10/29(月) 21:34:43
>>40 エミュするのめんどいんで、自力でなんとかしてくれ。
>>42 正確に数えたことないけど数十倍の時間がかかるはず。
根性でもう少し高速化できるかも知れんが、あくまで救済措置だからのう…
そんな所にエネルギー使いたくない。
45 :
デフォルトの名無しさん :2007/10/31(水) 03:47:24
__DATE__とか__TIME__を現在の日時に展開するのをやめさせたいんですが、何か方法はありますか? こいつらのせいで、毎回チェックサムの異なるバイナリが生成されてしまいます・・・。
undef?
47 :
デフォルトの名無しさん :2007/10/31(水) 04:27:42
できないみたい
__DATE__と__FILE__を含む行をコメントアウト
#define __DATE__ "" はムリ?
50 :
デフォルトの名無しさん :2007/10/31(水) 04:36:47
redefeindでerror
コンパイルオプションに -undef ってなかったっけ? それでも __DATE__ とかには効かないかもしれないけどね。
#if defined(__DATE__) #undef __DATE__ #define __DATE__ "2007/10/31" #endif
-undefは他のマクロも消えて影響大きすぎるから gcc -U__DATE__ -D__DATE__=\"hoge\" でいいだろ。
54 :
デフォルトの名無しさん :2007/10/31(水) 18:09:14
無料だな
4.3もやっぱり実行速度は今までのより遅くなっているみたいだね
56 :
デフォルトの名無しさん :2007/11/06(火) 05:57:27
LLVMってどうなのさ
llvmで検索してでてくる日本語サイトがゴミ
gccのltoが手間取っている間にこっちは順調にやってるぽい? まだ最適化のステージがgccには及ばない部分もあるかもしれない。 まだちょっとバグがあるけど、もう一歩で実用的になりそうな気配が。 結構appleがコミットしてるな。 offline optimizationとやらがいまいちよくわからないけど、 apiで簡単に使えるようなフレームワークがあるのかな? llvm-gccで直にコンパイルしたらバイナリサイズが結構でかいんだが、 中に実行時最適化の為のコードが入ってるのかな。 どういう手順で使うのが普通なんだろ。
offlineってのはruntimeじゃない時。 compile-timeでもlink-timeでもない。 インストールした直後とか、利用者に指示された時。
62 :
デフォルトの名無しさん :2007/11/09(金) 18:40:12
QT
llvm-gcc4をcygwin上でbuildできた人はいる? stage2でerrorになるのだが… どうも、stage1で作ったxgccの動作確認で失敗してるみたい。 空のmain関数だけのtpをxgccでcompileして実行するとseg. faultで落ちる。 生成したアセンブリを見ると、spを変な値に設定してるようだ。
cygwinじゃないけどcflagsに何かmarchあたりの設定してるとビルドできなかった。
65 :
デフォルトの名無しさん :2007/11/12(月) 02:09:17
モノによっては -mtune=k7 とか、mtune指定するとダメなやつもあったり そもそも-marchやるだけでダメなやつもあったり -targetとか、あそこらへん指定すると cannot build executable とか出くさるものもあったり
demand pagingってオプションやプラグマとかで 無効化できないものでしょうか?
どのdemand pagingのことを言っているのかは知らないけど、 ふつうはOSの機能なんじゃないの?
VM?
gccでexitをフックするにはどうしたらいいでしょうか? segmentation faltとかならgdbで場所を把握できるんですが, exitで普通に終わってしまって..
at_exit?
71 :
デフォルトの名無しさん :2007/11/13(火) 18:29:12
>>69 (gdb) b exit
(gdb) b _exit
では止まらないと申すか。
72 :
デフォルトの名無しさん :2007/11/16(金) 17:40:13
#include <stdio.h> #include <sys/types.h> int main(void) { printf("%d\n",sizeof(size_t)*8; return 0; } 例えば上のようなプログラムでは /usr/include/libのどのファイル使って実行ファイルを 作成するんでしょうか できれば調べ方なんか知りたいですが
>>72 gcc -v foo.c とか、
ldd 実行ファイル とか
1つ質問なのですが、ここで良いでしょうか。
OSはFreeBSD6.3-PRERELEASEで、C言語の勉強をしていました。
ソースは酷い有様なのでエラーが多発するのは分かるのですが、
何かいつもと違うメッセージが出まして・・・。
最後の3行が(手書きですが)
cc: Internal error: Segmentation fault: 11 (program ld)
Please submit a full bug report.
See <URL:
http://gcc.gnu.org/bugs.html > for instructions.
と書いてありました。
これってどうしたら良いでしょうか。
放っておけば良いとは思うのですが、気になったものでして。
76 :
75です :2007/11/17(土) 02:44:26
すみません自己解決しました。原因が分かりました。 コマンドを間違えて打っていました。 いつもは cc -o (実行ファイルの名前) (ソースファイル) で打っていたのですが今回 cc (実行ファイルの名前) (ソースファイル) と打ち込んで実行していました。 お騒がせしました。
77 :
デフォルトの名無しさん :2007/11/18(日) 00:09:24
大有りだろ 何がリンクされたか一目瞭然じゃん
最近の子はマップファイルの出し方も知らんのかね?
-pthreadと-lpthreadの違いって何ですか? 個人的には常に後者を使ったほうがわかりやすいと思うんですけど なんでライブラリなしのオプションがGCCにあるのでしょう?
>>80 単にライブラリをリンクするだけじゃ対応できない部分があるので、
gcc的にもちゃんとthreadをサポートしてくれる(かもしれない)オプション。
>>80 実際に試してみれば判るけど、若干できたバイナリに違いがあるから
特に指定のない限り-pthreadの方がいいと思われる。
HP-UXとか要注意な。infoかソース読んで。 gccはスレッドローカル変数とかあって、 ライブラリに全部頼るわけにいかない部分もあるし。
84 :
デフォルトの名無しさん :2007/11/18(日) 20:23:57
誰も-pthreadについて具体的な事を語らない罠。 ま、infoにも詳しい情報ないししょうがないとは思うがw
出来損ないOSではつけないとイカンようですな
正直あまり意味のないオプションだからね。今となっては。 #include <pthread.h>と-lpthreadで全て済んでしまう。
>>81 でFA出てるじゃん。
gcc的にも、というだけじゃなくOS(ライブラリ)的にもだけど。
>>85 gccで-pthreadまたは-pthreadsオプションがあるOSは
Linux, Darwin, *BSD, System V, HP-UX, AIX, Solaris
があるが、これら全て出来損ない? w
そうだよ 完璧なOSはWindowsのみ
つけてもつけなくても同じ、 と つけないと正常に動作しない、 は全然違うぞ。 んで、出来ソコナイはどれ?Linuxは違うな。
90 :
デフォルトの名無しさん :2007/11/19(月) 00:14:11
リンカ言うと、変な四角い顔したタレントが思い出されて嫌である。
91 :
デフォルトの名無しさん :2007/11/19(月) 01:30:12
>>87 OSじゃなくてarch依存じゃなかったか。
それと、gccのinfoにはプリプロセサとリンカにマルチスレッドプログラムのコンパイルを行なっていることを伝えるオプションだと書いてあるだけで、実際に何が変化するのかは書いてなくない?
-D_REENTRANTとの関係も教えてくれ。i386のLinuxの話でいいから。
具体的に語る人を待とう。
>>87 には無理そうだが。
Sunとかのコンパイラの-mtみたいなもんだろ。
とうとうここも低能のアホレス来るようになったか。
95 :
80 :2007/11/20(火) 11:24:03
おいらの質問で場が荒れたみたいですんませんでした。 レスをくれた人どうも。 とりあえずi386 GNU/LinuxのGCC -pthreadすると プリプロセサで#define _REENTRANT 1が定義されますね。 あとはリンカで-lpthreadやってるだけなのかなあ。
なぜこういうことを聞いたかってのは下の記事
「pkgconfigとlibtoolの悪」
http://udrepper.livejournal.com/19395.html で、-pthreadしてると-Wl,--as-neededが効かなくなるぞって話です。
で、pkgconfig/*.pcを検索してみたら-pthreadをしてるのはQt関連とgthreadだけ。
だったら、-pthreadを-D_REENTRANT -lpthreadで置き換えられないかなあ
と思って聞いたわけです。
ただ、たとえそうしてもLDFLAGS=-Wl,--as-neededをやるとコンパイルできない
プログラムなんかもあったりして不思議ですが。
97 :
デフォルトの名無しさん :2007/11/20(火) 16:57:23
>>87 Linuxのmanでは「-pthread」はFreeBSD固有のオプションってなってるけど。。。
>>97 偏屈なmanだな。
OSXでman gccしたらRS/6000andPowerPCのオプションに書いてあるな。
i386にはないんだろうか。
>>98 Fedora 8に入ってるmanを見てみました。
gcc-4.1.2のマニュアルだと、
IA-64 Option, RS/6000 and PowerPC Options, SPARC Options
に書いてあります。
FreeBSD固有って書いてあるのは、Linux日本語manだけど、gcc-2.95.3の翻訳だから今となっては古い。
freebsdのスレッド対応ってまともになったん?まだグダグダ?
101 :
デフォルトの名無しさん :2007/11/21(水) 13:55:08
まともだよ。 ただGPLがらみでgcc止めるとか言い出している人いるから、 また諸々ぐだぐだになるかも。
102 :
デフォルトの名無しさん :2007/11/21(水) 21:43:37
なぁ、Linux上でGCC4を使っています。コンパイルしたアプリケーション中、 各モジュールがどう構成されているのかを知りたいのだけどどうすれば いいのかな。知りたいのは以下の通り 読み取り専用データサイズ(コード+定数) 読み書き可能なデータサイズ ゼロクリアされるデータサイズ また動作しているアプリケーションのメモリ中、共有ライブラリが 使用しているメモリサイズ、ヒープ領域のサイズ、スタック領域のサイズ も知りたいのだけど。どうしたらええんかな。
$ size a.out $ lsof -p PID じゃダメか? ライブラリの使っているメモリの区分ってのは難しいな。 テキスト領域しか分からない。 別のヒープ、スタック使ってるわけじゃないから。 スタックについては、debuggerが頑張れば追跡可能だろうけども。
/proc ? gccのネタ関係なry
105 :
デフォルトの名無しさん :2007/11/21(水) 22:12:48
>>103 ありがとう!sizeがまさに欲しかったものでした。
-=-::.
/ \:\
.| ミ:::|
ミ|_≡=、´ `, ≡=_、 |;/
||. ◎ .| ̄|. ◎ |─/ヽ 我は成大作・姜尚中・張勲・郭光雄・成田豊・辛格浩・盧勝正公認
|ヽ二/ \二/ ∂> 恨憎貶日創価高麗大使である。お前が立てたスレッドをグレート
/. ハ - −ハ |_/ コリアレスリングエンターテインメントワイドショースレッドとして認定する。
| ヽ/ヽ/\_ノ / |
. \、 ヽ二二/ヽ / /
. \i ___ /_/
___
/ ?\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウ
/ノ (@)\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッキ
.| (@) ⌒)\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッ
.| (__ノ ̄| | ///;ト, ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
\ |_/ / ////゙l゙l; ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
\ _ノ l .i .! | ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
/´ `\ │ | .| ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
|
>>1 | { .ノ.ノ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
| |../ / . ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウ
107 :
デフォルトの名無しさん :2007/11/21(水) 23:38:06
>>105 共有ライブラリ云々は、.soをsizeすればいい。
が、sizeで出力されるtextサイズには.rodataセクションのサイズは含まれていないと思う。そっちはreadelfかな。
あと、sizeじゃヒープとスタックのサイズもわからんだろう。それはいいのか?
簡単なのは、 /proc/pid/maps 見るとかかな。粒度荒いけど。
sizeで情報が足りなかったらldにmapfile吐かせれば大抵間にあうだろ。
109 :
デフォルトの名無しさん :2007/11/23(金) 00:40:26
kwsk 出力付きでな。
110 :
デフォルトの名無しさん :2007/11/25(日) 23:06:34
群馬のGCCの池田には散々嫌がらせをされたなー。 あの野郎あったら確実に・・・ まーここのスレとは関係ないが。
>>111 >4.1でこれなら4.2,4.3と結構速くなっきているから結構いい線いってんのかな?
それはダウト
少なくとも4.2ではかなり遅くなった
4.3では性能向上…のはずが、いつのまにかパッとしない性能で仕上がっちゃってる
確かにvectorizeはどうもね…バグがまだ潰しきれてない感じ
C++派の俺から観ると、4.3は非常によろしいんだけど、 C数値計算はたまらんでしょうな。
4.3は4.2と同様、4.1よりはかなり性能悪くなってた でもメーリングリストではコードの信頼性が上がるなら 性能などいくらでも落ちてよいって流れだったから これからも性能は悪化し続けそう
数値計算する場合は細かなチューニングよりもGOMP使ってくださいサーセンwwww ってところじゃないのかな。
もしかして1コードだけのregressionで判断してるのか。
いや最近期待できない方向に進んでるみたいだから悲観的になってるだけ
120 :
デフォルトの名無しさん :2007/11/28(水) 16:56:46
GOMPで思い出したが、ゴンプ言うな。
判断してるってことだよ
以前このスレにgcc-2.95が最高で、以後はクソとひたすら叫んでいるヤシがいたけど、 そいつがまだ粘着しておるのか?
違うよ その人は実行速度のことは気にしてないんじゃなかった?
コンパイル速度を気にしている人はいたな。 俺はC++の標準準拠最優先だから、人それぞれって事で。
もっとベンチ結果無いかな
127 :
デフォルトの名無しさん :2007/11/28(水) 22:40:30
俺はコンパイル速度よりもコンパイル後の実効速度さえ速ければいいや。
128 :
デフォルトの名無しさん :2007/11/29(木) 10:30:05
gcc4.2.0をインストールしようと思っているのですが、 configureしてmakeすると、parse-scan.cが見つからないと出てしまい、 それはネットで拾ってきて入れたら、通ったのですが、今度は java/jv-scan.o: In function `main': ../.././gcc/java/jv-scan.c:221: undefined reference to `main_input_filename' と出て、その解決方法がわかりません。そのchar*型変数自体はgcc/toplev.cに宣言されているので、 toplev.hにextern宣言して、jv-scan.cに明示的にインクルードしてみたんですが、それでもダメです。 この解決方法や解決案について誰か教えてください。 SuSE Linux 10.1です。
parse-scan.cはparse-scan.yから作られます。 bisonがinstallされてないと生成できません。 ・エラーメッセージをちゃんと読んでない ・かなり無茶をしている ・既にそのbuild環境はダーティ なので、冷静になって初めからやり直してください。 SuSEなら何の問題もなく作成できると思います。
>>129 ご回答どうもありがとうございました^^)
bisonをインストールしたら、gccも無事にビルド出来ました!
P4 1.8GHzでmakeに4時間もかかったよママン
gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ gccは2.95が最高、以後はクソ
俺もそう思っていたけど、2.95 が手元の環境でビルド出来なくなっていて驚いた。
flexやbisonがなくてもconfigureに成功してしまうのは、 何かの陰謀なのかねえ
x86_64に対応してればなんでもいいよ
135 :
デフォルトの名無しさん :2007/12/01(土) 23:27:43
オアーオアーオアオアオアー
gcc、お呼びgcc javaについて理解できないのですが助言お願いします。 情報を求めてwiki等を見回っていると、 gcc javaはネイティブなコードを出力するとあります。 これはVM上で動作するバイトコードではなく、マシンで直接動作するバイナリコードという事でしょうか? 又、gccの言語間の関数、クラス等の呼出は可能でしょうか。
>>136 ネイティヴコードってのはそういうこと.gcjは以下の変換ができる.
- Javaソースコード→プラットフォームのネイティブコード
- Javaソースコード→Java クラスファイル
- Java クラスファイル→プラットフォームのネイティブコード
>又、gccの言語間の関数、クラス等の呼出は可能でしょうか。
gcj の場合はJNIかCNIのいずれかの規約にしたがってのみCやC++のAPIを呼びだせる.
Sunのオープンソースになったクラスライブラリも ずいぶんとgcjでコンパイルできるようになってきたね。
gcjはネイティブコードと言ってもCほど速くないのが何とも。
アルゴリズムによってはVM方式のほうが速い場合なんていくらでもあるだろう JavaなんてC++で言うところのRTTIを使いまくりなんだしさあ。 ハゲがC++をvirtual宣言してないとオーバーライドできない糞仕様にしたのも パフォーマンスの問題があるからでしょ(つまり糞仕様じゃないってことなんだけど)
virtualでオーバーロードしたら遅くなるのは自分で設計してみりゃ脳内ですぐ気付く問題
>>142 vtbl経由するコストだけで、オーバーロードは関係ないだろ。
オーバーライドと混同したって話だろうな
#include <sstream> #include <string> using namespace std; int main(void){ stringstream ss; string str; ss.str("test1 test2 test3"); // ss >> str; //←この行のコメントを外すと、コンパイルは通るが実行するとセグメンテーションフォルト return 0; } >gcc --version 2.96 バグですか?
>>145 バージョンが古すぎて調べる気にもならん。
(´・ω・`) 管理者に言ってバージョンあげてもらいます。
cygwin版gcc 4.0まだー?
149 :
デフォルトの名無しさん :2007/12/19(水) 00:32:39
古いものなら何でもかんでも安定する!とか言って、単に今ある最新版から テキトーにマイナス3くらいしたバグだらけの古いもの採用するVine Linuxとかある 本当に実績のあるものを選んでいるわけではなく、まさにテキトー。 最強バグ版のGCC4.0.2採用しているあたり実績で見てるわけじゃない
この板で鳥の話出す馬鹿
151 :
デフォルトの名無しさん :2007/12/20(木) 15:00:05
スレ違いだったらすみません。 GCCでコンパイル時と別のコンパイラでコンパイル時とを #ifで分けたいのですが、GCCでコンパイル時必ずdefineされる マクロってありますか?
__GNU__?
__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
#if defined( __GNUC__ ) #if ( __GNUC__ >= 4 ) かな
IntelのCコンパイラだとデフォルトでは
>>153 をdefineしている(オプションで変更可)
特殊かもしれんが
RHLE version3 のサポートが終了してしまうので、 gcc 2.9.6 gcc 3.2.3 から、 RELE version5のgcc 4..xに変更したんだけど、コードの修正メンドくせー、 互換性無いのって悲しいね。
×互換性が無い ○コードが汚い ザルだった文法チェックに救われていただけ
普通に書いていれば修正なんてほとんど要らんだろ
>>157 じゃないが、
Cだとgccの移行は簡単だけど、C++だと悲惨。
2->4なんて。
コンパイルエラー/ウォーニングになるのはいいけど、
コンパイラが検出できない奴など。
例えばlookupのルール変更とか。
ADLは便利だけど、難しいから。
>>160 馬鹿コーディングだから移行が難しいんだよ。
俺も新人だった頃の自分のコードを呪ったよ。
きちんとしたコードはすぐ移行できた。
162 :
157 :2007/12/23(日) 23:53:40
確かにコードが汚いことが原因で トークンの連結 型(int -> bool) プロトタイプ宣言 関係が9割超
precompiled headerって全然流行らないね。信用できるのこの機能
意外と使われてるのに…
>>165 mudflapというオプションを初めて知った。 ひで〜ネーミングだな。
167 :
デフォルトの名無しさん :2008/01/15(火) 18:42:33
速度云々を無視しよう という条件下だと、fPICって常に付与してていいもんなのか?
168 :
デフォルトの名無しさん :2008/01/15(火) 23:54:54
gcc(3.4)でSJISファイルのコンパイルでうまくいかないので、ご教授いただけたらと思います。 > cat a.c #include "stdio.h" #define AAA(a) BBB(#a) void BBB(char *str) { printf("%s\n", str); } int main() { AAA(あ"い"); BBB("あ\"い\""); } > gcc --input-charset=cp932 --exec-charset=cp932 a.c > a.out あ"磚 あ"い" AAAの方とBBBの方で両方同じ結果が得られそうなのですが、 AAAの方でうまくいっていないのを解決したいと思っています。 ここでは標準出力していますが、内部文字コードはSJISのまま解決したいと思っています。 よろしくお願いいたします。
169 :
デフォルトの名無しさん :2008/01/16(水) 08:04:12
CスレでGCCの範囲だから、すれ違いと言われてここに来ました。
http://homepage2.nifty.com/m_kamada/fractalp.htm#mandelbmp_c のサイトにある、complex.hを読んでいるんですが、
gccでマクロを展開してここのソースを読むと、
/* setjmp(cjmpenv)の返却値 */
#define C_DIVIDE_BY_ZERO 1 /* 0で除算しようとした */
#define C_ARG_ZERO 2 /* 0の角度を求めようとした */
略
#endif
#if __GNUC__==2
#define complex __complex__
#define Re(z) (__real__ (z))
#define Im(z) (__imag__ (z))
#else
typedef struct {
double re;
double im;
} complex;
などごっそり書いてあった部分が、
/* setjmp(cjmpenv)の返却値 */
# 24 "complex.h"
typedef struct {
double re;
double im;
} complex;
# 77 "complex.h"
/* xの実数部にsを加える */
# 89 "complex.h"
/* xの虚数部にsを加える */
と、# 24 "complex.h"や# 77 "complex.h"などに置き換えられているようです。
この#24や#77はどういう意味なのでしょうか?
>>168 3.4では化けるね
4.2.2だと化けなかった
それと、 「複素数値を持つ式 exp から実数部を抽出するには、 __real__ exp と書きます。同様に、虚数部を抽出するには __imag__ を使います。これはGCCの拡張である。」 とあり、printf("b=%d + %d I¥n", __real__ exp, __imag__ exp); で複素数表示出るのですが、 コレは__real__ という関数名なのでしょうか? でも関数だと( )が必要だし.... そもそも__みたいな変な名前のマクロをどういう意図で作ったのでしょうか? complex.hを見ても良くわかりませんでした。 __のような物がつくプログラムを見たのが初めてで、非常に理解に苦しんでいます。
>>169 マクロ展開前の行番号。コンパイル時にエラー行を表示するためにそう
いう情報を残す必要がある。
>>171 sizeof と同じような形式の演算子だと思えばいいんじゃない?
__は単に名前の一部。
普通の名前と喧嘩しないように __ を付けるのは慣例
慣例じゃなくて予約されているんだが
>>172 ,173,174
お返事有り難うございます。
>普通の名前と喧嘩しないように __ を付けるのは慣例
>慣例じゃなくて予約されているんだが
確かに__って普通の変数には付けないですからね。
どうも有り難うございました。
あ失礼,そうだった.<慣例
書き方おかしかった.<慣例,じゃなくて<予約 スレ汚しすまん
178 :
デフォルトの名無しさん :2008/01/17(木) 01:56:01
gdb+gccなんですがクロスコンパイルしてます。 Aでコンパイル Bで実行。 Bで、はいたコアダンプを冢ってgdbを使いたい場合は Aでmakefile(自動生成)使ってまっす。 どうしたら、ディレクトリ構造とか再現してソース追っかけながらデバッグできますか? makefileに答え有りますか?
179 :
デフォルトの名無しさん :2008/01/17(木) 02:03:30
Bで、はいたコアダンプを冢ってgdbを使いたい場合はどうしたら良いですか? 文が変だた
>>178 Bでgdbserver走らせるのが一番楽じゃない?
181 :
デフォルトの名無しさん :2008/01/17(木) 02:08:28
>>180 おとなの事情というか会社の事情で無理なんです
182 :
181 :2008/01/17(木) 02:30:08
少し確認ですが Aにもgdbserverがデーモンのように動く必要ありますか? Bにも同じgdbserverが必要ですよね? Aで負荷高くなりそうですね
>>180 あ、ごめん、コアの話しか。 そういう機能はgdbserverにはないね。
だめだ。 __real__って何なんだ? 関数ではないしcomplex.hにも定義されていない。 gcc機能拡張ってのがよくまずわからない。 特殊な演算子なんですか?
>>184 わからないなら自前の構造体定義すれば?
>>184 何をわかる必要があるというんだろう。sizeof だってどこかのヘッダで
定義してあるわけじゃないけど使えるでしょ?
infoの説明はこれだけしかないけど、これで十分つかえるじゃないか。
> To extract the real part of a complex-valued expression EXP, write
> `__real__ EXP'. Likewise, use `__imag__' to extract the imaginary
> part.
みんなGDBを使ってデバッグしてるの? それともprintf?
うかつに手を出せないところはInsight使ってるけど printfの方が早いな
printfで場所を大まかに限定してソースとにらめっこ ドコでも使えて簡単だから…
んで core 吐いたら gdb
printfってプログラム埋め込み? debuggerのbreakpointsでprintfするんじゃなくて? 埋め込みなんてここ5年くらいやったことないわ。
デバッグトレースした方が便利な事もあるぜ。
デバッグトレースって何さ
デバッグ時のみ文字列出力。
社内用語乙。
デバッグトレース の検索結果 約 3,320 件
でもまー、ふつー「バックトレース」
違った。 つか「デバッグトレース」って、デバッグ目的のトレース実行とか、 呼び出し順の出力のことじゃね?
「光ファイバーチャネル」みたいなもんだな。
TRACE(_T("Debug trace\n"));
MFC だな
MFCって、GCCで使えるんですか?
mingw で使えるんじゃね?
207 :
デフォルトの名無しさん :2008/01/27(日) 18:47:27
お前ら、4.3の話でもしようぜ
208 :
デフォルトの名無しさん :2008/01/31(木) 08:26:24
とりあえず「ミングダブリュー」って言うな。
明w
ミングダブリューさんじゅうにって読んでた ミンジーダブリュー?
ミンジーダブリューって読んでた
ミングウだろ・・・常識的に考えて・・・
みんな MinGW の読み方には苦労してんのね
みんぐぅ
ミンジーダブリューだろ・・・常識的に考えて・・・
ゴールデンウィーク最小
みんぐうぃん
エムアイエヌジーダブリューだろ・・・常識的に考えて・・・
そういやいつからMingwinからMinGWになったん? 前は「みんぐぃん」て発音できたが今のは悩む・・・
つまり みにまりすとぬーふぉーういんどーず と読むと?
マゾ イン ゴールド ウォーターって読んでたわ・・・
MGW
みんぐw
225 :
デフォルトの名無しさん :2008/02/01(金) 09:09:52
ゴールデンウィークが最小限な事。 また、それを嘆くさま。
みんぐー
227 :
デフォルトの名無しさん :2008/02/01(金) 17:30:48
お前ら、4.3の話でもしようぜ
今年度中にリリースされる?
February 1, 2008 GCC 4.2.3 has been released.
230 :
デフォルトの名無しさん :2008/02/03(日) 23:00:40
すいません.質問させてください. GCC のソースコードを読み解いて理解したいと思っているのですが, 手始めに,あるいはコードを解読する際のガイドとして読んでおくべき 書籍あるいはサイトで,有用なものとしてはどんなものがありますでしょうか? 英語でもまったくかまいません. 一応,自分が読んで理解したい部分は C++ コンパイラの字句・構文解析部 (フロントエンド部と呼ぶようですけれど) です.
茨の道じゃろうて・・・ コンパイラを作りたいか?カスタマイズしたいのか?
GCCのすぱげっち読むよりはもうちょっとマシなものありそうだけど。
233 :
230 :2008/02/04(月) 01:04:00
>>231 茨の道なのは重々承知のつもりでお聞きしています.
動機は最終的にはカスタマイズですけれど,
純粋に GCC の挙動を理解するだけでも得るものはあるかとは思っています.
234 :
デフォルトの名無しさん :2008/02/04(月) 01:55:12
#pragma once は今でも非推奨ですか?
>>230 ,233
最終目標がGCCのカスタマイズなら、最初からGCCのソースを追えばいいかもね。
コンパイラの作り方を知りたいなら、ソースから読むのは学習効率が悪い。
ついでに、GCCはスパゲティだし大きいしで選択肢としても良くない。
もしまだ知らないなら、古典のdragon bookを読むとか、flex & bisonを触るとか
その辺からでは。最近の事情はわからんので、もっと手っ取り早い方法があるかも。
もしかして、GCCの最適化エンジンとかプロセッサ対応とかのバックエンド側を
いじりたいんではなく、フロントエンド側(入力言語)を拡張したいん?
GCCのドキュメントのどこかに一通り書いてありそうだが、漏れは知らんわ。すまん。
GENERICやGIMPLEを探ればいいんかな。
236 :
230 :2008/02/04(月) 02:13:34
>>235 非常に参考になる意見ありがとうございます.
>もしまだ知らないなら、古典のdragon bookを読むとか、flex & bisonを触るとか
dragon book は持ってはいますが気合入れて読んだことがなかったです.頑張って精読します.
flex & bison も玩具程度の弄り方しか試してなかったので,ちょっと本気で触ってみます.
>もしかして、GCCの最適化エンジンとかプロセッサ対応とかのバックエンド側を
>いじりたいんではなく、フロントエンド側(入力言語)を拡張したいん?
はい,バックエンド側には今のところほとんど興味がありません.
最終的な目標はフロントエンド側 (入力言語……といいますか C++) の拡張です.
ただ,これはあくまで最終的な目標として設定しているだけです.
なんかそういうプロジェクトをどこかで見たような gccじゃなくて
LLVM?
>>237 > なんかそういうプロジェクトをどこかで見たような
> gccじゃなくて
COINS?
入力言語をC++に変換するプリプリプロセッサを作るのが簡単のような
NVIDIAのCUDAのコンパイラ(nvcc)が内部でgcc使っているみたいだ。 つまり、拡張仕様の入力から独自仕様の出力を得ている模様。
Cell 用の spu-gcc もかなり弄ってるみたい
244 :
230 :2008/02/04(月) 20:11:15
GCC を弄る先例として色々見る価値のあるプロジェクトはあるみたいですね.
>>240 構文チェックなどについては GCC に実装されている部分を流用し,
interact させたいので,独立した preprocessing は今のところ考えていないです.
>>243 色々助言していただいて本当に助かります.
質問させてください。 wxWidetsっていうのを使ってプログラミングしてるんですが、 g++ -o hello2 hello2.o `wx-config --libs` みたいにやると /usr/lib/gcc/i486-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' って言われてしまい、コンパイルできません。何がいかんのでしょう?? これだけだと分からないと言われそうなのですが、ソースがちょっと長いので・・ でも参考サイトの指示通りに書いた簡単なプログラムなので、ソースじゃなくて何か基本的な設定とかが間違ってるんじゃないかと思ってここに来ました。 OSはubuntu7.1.0です。他のプログラムならコンパイル出来ている状態です。(やはりソースが間違ってるんでしょうか・・) どなたかアドバイス頂けると幸いです。
>undefined reference to `main'
wo神ならなんとかしてくれる
249 :
245 :2008/02/05(火) 04:35:12
すいません解決しました。やはりただのソースの問題でした。 247さんありがとうございましたm(_ _)m
r300って、MIPSの何かかと思ってしまった。。R800でもいいけど。
>>253 > R800でもいいけど。
懐かしいね
>>252 なんか最近、wxの・・・更に言うならwx-configの話題をよく見かけるな
どこかで流行ってるのかね
256 :
デフォルトの名無しさん :2008/02/09(土) 23:35:10
GCCで、どこからも参照されていない関数を除去するオプションを探しています。 VC++でいうとプロパティ -> リンカ -> 参照の「参照されないデータを除去する」です。 GCCのバージョンは4.2.2で、組み込み向けのクロス環境です。
それはgccじゃなくてリンカldの仕事。VC++でもリンカliの仕事。 んで、--as-neededがそれなのかな?よく知らないいけど。 gccから渡すには、-Wl,LFLAGSのようだけど。
スタティックリンクしてるのかな? 正直スタティックリンクまわりは普段使ってないのでどうにも...
-ffunction-sections あたりでggr
260 :
259 :2008/02/10(日) 01:30:59
>>256 関数だけじゃなく、グローバル変数も除去したいなら、-fdata-sectionsも要るな。
「データ」って書いてあるので一応補足。
>>257 それは、ライブラリを必要に応じてリンクしろというオプションだから今は関係内ね。
ldに渡すのは--gc-sectionsだったかな。
261 :
256 :2008/02/10(日) 01:45:00
>>260 -ffunction-sections -Wl,--gc-sectionsを試してみましたが、目立った効果は無いみたいです。
COFFなのが原因かもしれないです。
COFFか。。それはよくわかんないな。 ELFのstatic linkでしか試したことが無い。
263 :
256 :2008/02/10(日) 02:12:19
>>262 とりあえず地道に小分けにして対応することにします。
ありがとうございました。
今更なんだけど、gccって、せっかく一旦yaccだかbisonだかを使う事にしたのに また手書きのパーザに戻したらしいよね。なんでなんだろ? 普通にパーザジェネレータ使ってた方が、何かと便利だろうに。
GCC全体じゃなくてC++のフロントエンドだけ。 C++がLALRでパースするのはキツい変態言語ってだけでは。
267 :
264 :2008/02/10(日) 13:25:54
サンクス。 なんか下のpdfの冒頭、凄いこと書いてるな。自然言語パーザの方がふさわしいって? いや辞書片手に読んでるだけだから、誤読かもわからんけど。 まあ上手く動いてるなら、いいか。。。 できるだけ、へたな努力はしないで欲しいんだけどな。。。 つか、パーザジェネレータ使う方が「へたな努力」になってしまうって事? ・・・あれ?そうすると、「へたな努力」って何なんだっけ? ちょっと電波板で独り言つぶやいてくる。
bison では GLR をサポートしているらしいが、 それでも bison は使えないんだろうか?
あんまり変体過ぎて、パーザジェネレータの分野が活発になっているという…
>>263 馬鹿げた方法だけど C++ なら全部ヘッダに inline で書く手もw
>>268 C++って、自然言語に匹敵しかねないほど文法が複雑ってことか……
Walter タンが D を作りたいと思った気持ちが分かるな。
ハゲって言った奴は誰だ!
びよ〜ん びよんびよ〜ん
しゅと・ら・うすらっぷ
すっぽすっぽ
来週にはRCビルドが始まるそうな。arch=core2にwktk
てかいまも使えるよ
llvmだいぶ速くなったものもあるみたいだけど、どうですか?
どうですか(笑)
gccをFPGAで作った自作のCPUに対応させたいんだけど、 binutilをいじればいいの? 何か参考になる書籍があれば教えて。
まずはgccintだろう。
285 :
デフォルトの名無しさん :2008/02/29(金) 02:16:52
4.4forkしますた
gdbについて聞きたいんですが、 fork()のとき、どっちのプロセスも追っていきたい ときってどうすればいいんでしょうか? ただしソースコードはいじれないとします。
もういっこgdb起動してアタッチ?
>>288 「-Oは以下の最適化フラグを有効にする」と書いてあるけど、それしか
しないとは書いてない。
gccのソースを見ると、「最適化レベルが1以上なら〜」というコードが
けっこう見付かるはず。
>>288 各最適化オプション -fxxx は -O が前提となってたりする。
だから -O 指定せずに -fxxx 指定して効果がなくてもそんなもの。
最適化フラグ指定でんでんはGCCのソース嫁
でんでん…
で...云々
まさか、「云々」を「でんでん」と読んでたりしないだろうな。
ここは痛いインターネッツでつね
「ガイシュツ」と同じくネタのつもりなんだろうけど、わざわざ読みに くく書くのは個人的には嫌いだ。
何年も前のネタでも反応が初々しい。このスレの住人は可愛い
>>288 実はディスクの方が律速で差が出なかったとか。
というかどうやって計って、どういう結果になったのか
書いてもらわんと難しいと思うわけで。
GNUをミラーしてるお近くのftpサーバへどうぞ、でいいんじゃないのか。
snapshots見てたから気づかなかったぜ
4.3の一番の売りは、主な数学関数をコンパイル時に展開してより最適化してくれるってことでOK?
-march=core2 -mtune=core2でしょ
geodeも忘れるな
で、4.1より早いの? じゃなきゃ糞だが
gcc-4.3のバイナリ実行速度は、integerについてはgcc-4.1よりも速いし、バグの数もgcc-4.1よりも少ない。
>>306 4.1から4.3で何が良くなったのか簡潔に頼む。
ggr (3バイト)
以前にベンチをnbenchとかbzip2とかで取ってみて比較した印象だと整数演算に関しては4.1より4.2の方が明らかに良いと 思っていて、最適化フラグが-O2の場合は4.2より4.3の方が若干良いという印象を持っていたのでそう書いたのでけど、 実は-O3の場合は事情が違って、4.2の方が4.3より良い結果になると思っています。つまり、 gcc-4.2-O2<gcc-4.3-O2<gcc-4.3-O3<gcc-4.2-O3 の順に性能が良くなると思っています。fateというベンチはstdout textを見ると-O3でコンパイルされているので 4.2の方が4.3より良い結果になるというのは順当だと思います。
C++ヲタだから、あんまり速度比較には興味ないんだけど、 4.3はforward propagationが大幅に書き換えられているから、 4.2のの頃の結果から4.3の振る舞いを推測するのは危険だぞ。
4.3.0今試してみたけどやっぱり4.1.2より遅いバイナリ吐いた あくまで自分が使うプログラムでってことだけど
速い遅い以前に挙動が変わっちゃって今トレース中だよ・・・
それは十中八九 GCC のせいじゃない。 まあ、警告が不十分だった事に起因してる点があれば 30% 程度は GCC にも責任があるかもしれないが。
>>307 http://gcc.gnu.org/gcc-4.3/cxx0x_status.html Status of Experimental C++0x Support in GCC 4.3
Rvalue references N2118 Yes
Rvalue references for *this N2439 No
Variadic templates N2242 Yes
Static assertions N1720 Yes
Declared type of an expression N2343 Yes
Right angle brackets N1757 Yes
Default template arguments for function templates DR226 Yes
Extern templates N1987 Yes
C99 Features in C++0x
__func__ predefined identifier N2340 Yes
C99 preprocessor N1653 Yes
long long N1811 Yes
もちろんg++起動オプションでオンにしたときだけ。
http://gcc.gnu.org/gcc-4.3/changes.html
>>314 まさかgccはlintにするために作ってるわけじゃあるまいに。なんだその30%て。
Linuxで最近よく自分でアプリやカーネルをmake installします。gccの最適化フラグをつけないとつけた時に 比べてやはり遅いんだなってのは体感しました。所がアプリによりつけたフラグによっては動きが悪くなる ってのも体感。 なので自分はソースが読めないのでgcc4.2シリーズの-march=native -O2のみにして全部これでやることに しました。それなりに快適に動いてます。 少し前からgcc4.3の最適化は4.2よりいいと書いてある記事をみて開発版の4.3を入れたけど なんか動きがかなり違う。コンパイルが出来ない(一切フラグをつけなくても)物も出てきた。 それどころかある設定をしないとカーネルでさえコンパイル出来ないんですね・・・・ ググってカーネルのmakeファイルに設定を追加して出来上がった物も動きが悪いです・・・ やはり今回の正式リリースもカーネルとかそのままコンパイル出来ないんでしょうか? まあ、それは対策が解るからいいものの、使った感じちょっとソースが読めないような自分が使う物ではないな と感じたです。コンパイルエラーが出たのをネットでググる時間が(TT)
ソース読めない、情報拾うのが涙目、って状態で開発版を入れる神経が理解できない。
>>318 じゃあ正式リリース版のgcc4.3.0では何もいじらなくてカーネルコンパイルくらいは平気で出来るの?
4.2シリーズは開発版だろうがまるで神経使わなかったけど。
じゃあ(笑)
>>319 開発版を入れる神経を疑いはするが、4.3が安定しているかどうかは知らない。
私ゃ態々カーネルをコンパイルし直すほど暇じゃないんでね。
そうそう体感できるものでもないだろ 0.3秒かかってたのが0.27秒とかになったとしても
どうせGentooユーザなんだろうなぁ
春厨だよ
>>322 安定とかの問題以前でgccサイドとカーネルサイドの意見が違っててどっちも直さないってのが
ある筈なんだけど・・・
gcc4.3、カーネルと聞いて思い浮かばないようならもう話はいいですww
「ある筈なんだけど」っていう程度の人は、 リリースされたばかりのコンパイラを使わない方がいいと思うよ > やはり今回の正式リリースもカーネルとかそのままコンパイル出来ないんでしょうか? あなたにはよく分からないことだから。
すいませんちょっとお尋ねしたいのですが、 コンパイル時に二つのオプションを使うことってできるのでしょうか? 例えば、若干スレ違い臭いのですが、質問させてください。 例えば、 `wx-config --cppflags` と `pkg-config --cflags gtk+-2.0` を同時に使いたいのです。 同時に使えるとしたらどのように書けばいいのでしょうか。 どなたかご教示頂けると幸いです。
329 :
328 :2008/03/11(火) 00:05:15
3行目コピペミスなので無視してください・・
別スレでレスがつかなかったからこっちで・・・とか そのくらいの経緯は書いて欲しいな。 というか、向こうでレスついたぞ。
331 :
329 :2008/03/11(火) 00:16:00
>330 すいません、そういうもんなのですか。以後気をつけます。 レスついたみたいですね。ありがとうございましたm(_ _)m
ん?GTK+スレでもwxスレでもないどこかなのかな?ま、いいか
カーネルに限らず、O2レベルでもミスコンパイルはよくあるから別に驚く話でもないが。 GCCコミッテーに文句つけて今の版のバグフィックスをしろよ、クソハゲドモと外人に文句垂れてくるんなら 俺は得に気に留めないよ。
336 :
sage :2008/03/13(木) 10:12:58
int result; __asm__ ( "imull %%edx\n\t" "idivl %3\n\t" : "=a" (result) /* out */ : "a" (m1), "d" (m2), "g" (d) /* in */ : "ax", "dx" /* mod */ ); return result; } でコンパイルするとcan't find a register in class ‘AREG’ while reloading ‘asm’とのエラーが表示され、コンパイルできません。 どのように改善したら良いでしょうか。
なんか付帯情報が変な気がするんだけど、 何を参考にしました?
338 :
sage :2008/03/13(木) 10:38:28
koulesっていうゲームのソースをmakeしたところエラーが発生したので ソースを見てみたらわけわからんという状態です。
氏ね
gcc3 と 4 で変わったっけ?
g77 死亡
342 :
デフォルトの名無しさん :2008/04/06(日) 00:24:12
gccのオプションで-ggdb3,-gや-O0, -O2のようにどちらかしか採用されないようなオプションを 同時に渡したときどちらが採用されるのでしょうか? gcc -ggdb3 -O0 -g -O2 -c src.c -o src.o と実行したときsrc.oは「-ggdb3 -O0」それとも「-g -O2」?
引数の解釈する順番?
>>342 You can mix options and other arguments. For the most part, the order
you use doesn't matter. Order does matter when you use several options
of the same kind; for example, if you specify `-L' more than once, the
directories are searched in the order specified.
機能が被る場合にどうなるかは明記されてないが
理解の一助にはなるかな?
-Qとかつければ、どう解釈されてたか見れたような?
Windowsと違って、UNIXだとsleep(0)ってやっても効果ないの?
Windowsだとどんな効果があるの?
>>346 Windowsでの効果は知らないけれど、Linuxの場合はタスクスイッチングを強制させるのに使える。
要は「最低0秒」止まるので、他に処理するべきプロセスがあればそちらを実行することになる。
# 逆に言えば、最悪何秒も止まりっぱなしになるかもしれない。
pthread_yield
タスクスイッチというかカーネルへの制御の移行ね。 システムコールからそのまま戻るにしても既に送られたシグナルがあれば 戻る直前でシグナルハンドラが走る。 あとUNIXによってはsleepはプロセスタイマを使う可能性があるらしいので ユーザプログラム側でタイマを使う場合は注意が必要かも。
>>349 それはスレッドだから、
>>348 の言っていることとは違う。
pthread実装はカーネル・スレッドばかりじゃないから。
352 :
デフォルトの名無しさん :2008/04/07(月) 15:23:45
インクルードパスとライブラリのパスを環境変数で設定する方法を教えてください
今時、その手法ははやらないんじゃないの?
CPATH LIBRARY_PATH とか?
INCLUDES LD_LIBRARY_PATH
356 :
デフォルトの名無しさん :2008/04/08(火) 13:10:13
g++ で libfoo1.a と libfoo2.a をリンクしているのですが、 この2つのライブラリが相互に依存しているので、 undefined エラーになります。 libfoo1.a libfoo2.a のソースをいじることなく、 うまくリンクすることはできないでしょうか?
libfoo1.a内のどのオブジェクトがlibfoo2.a内のどのオブジェクトに依 存しているかなど、もうちょっと詳しい情報が欲しいけど、とりあえず gcc .... -lfoo1 -lfoo2 -lfoo1 のような感じでできへん? libfoo1.aとlibfoo2.aをバラして1つのlibfoo.aにしてしまうとかも。
359 :
デフォルトの名無しさん :2008/04/09(水) 13:51:18
LIBRARY_PATHとLD_LIBRARY_PATHの違いは何ですか?
ldかld.soか 要するにコンパイル(リンク)時か、実行時か。
361 :
デフォルトの名無しさん :2008/04/09(水) 16:39:29
>>352 どうやってやるの?
IとかLとかでいちいち指定するの?
それともmake?小さいプログラムではわざわざmakeなど使いたくないのだが。
スクリプトでやればいいじゃん
>>361 CFLAGS=-I/usr/include/foo
LDFLAGS=-L/usr/include/foo -lfoo
default: foo
これだけ。foo.cから実行ファイルfooを作る。
/usr/lib/gcc/target/version/includeのようなgcc付属のヘッダのある ディレクトリを取得する方法はありますか? -nostdincを指定してるソースからstdarg.h等を使いたいのです。
gcc -print-search-dirs
366 :
デフォルトの名無しさん :2008/04/10(木) 16:07:17
nm libhoge.a | grep hageとしたら 00001ffb t hageとでるのに int main() { return hage(); } のようにhageを呼び出してるプログラムのリンクが失敗するのですが どのような原因が考えられますでしょうか? gcc -g -O0 main.c -o huga -L. -lhoge main.c:2: undefined reference to `hage` collect2: ld はステータス 1 で終了しました
? gcc -v -g -O0 main.c -o huga -L. -lhoge
? gcc -v -g -O0 main.c -o huga -L. -lhoge -Wl,--verbose
369 :
デフォルトの名無しさん :2008/04/10(木) 17:43:36
CとFORTRANでは最適化の方法が違うの?
371 :
デフォルトの名無しさん :2008/04/14(月) 20:54:13
Cygwin上でGCCのC,C++のクロス環境を作ってます。 newlibと組み合わせてビルドはうまくいってるんですが、 libstdc++のgchファイルがかなりサイズを食っていて扱いづらいです。 実際には、C++の言語本体の機能だけ利用できれば十分です。 configure時にうまく無効にする方法などあれば教えてください。
libstdc++で configure --help やってみたら、何か出るかも?
373 :
デフォルトの名無しさん :2008/04/15(火) 13:22:43
GCCに、関数呼び出しとリターンを表示させたり記録させたりする オプションってありましたっけ? なんかあったような気もするけど、ぐぐってもヒットせんかった。
実行時だとみれるような機能があったような?
>>375 なにこれー!今日ほど2chが役に立った日はないわ。ちょーさんくすこ。
>>371 --enable-libstdcxx-pch build pre-compiled libstdc++ headers
[default=$is_hosted]
378 :
371 :2008/04/15(火) 21:11:44
>>372 ,377
ありがとうございます。
--disable-libstdcxx-pchを入れて試してみます。
gccで、クロージャとは言わないまでも、 ユーザーが作った関数へ、後から動的に値を埋め込む方法はありませんか? 言語処理系のコールバックの実装で、 その関数が呼び出された時に、その値を参照したいのです。 グローバル変数や、アセンブラを使えば作れるのですが、 できれば使わずに済ませたいので。
任意のパラメータを受け取れる void* 型の引数を作るといいよ。
つ 関数へのポインタ
#include </dev/tty>
>>380-381 いやそうじゃなくて。
言い方を変えれば、関数とユーザー値を組み合わせて
新しい関数を作れるかって事です。
その新しい関数は、呼び出し時に
なんらかの方法でユーザー値を受け取れる事。
また、誰が呼び出すかは判らないので、 ユーザー値をその関数の引数に入れる事はできません。
g() { return closure_ref(0) + 1; } f(pg) { return ((int (*)())pg)(); } main() { printf("%d\n", f(make_closure(g, 1))); return 0; } この場合2が表示される。 make_closureとclosure_refを作れるか fはstdlib.hのbsearchやqsortのように、 任意のライブラリの可能性もある。 (当然gはその型に合った関数型になる)
C++ならできるからg++使えってのはあり? #include <boost/tr1/functional.hpp> #include <boost/utility/result_of.hpp> #include <cstdio> template<typename T> T g(T x) { return x + 1; } template<typename T> typename boost::result_of<T ()>::type f(T g) { return g(); } int main() { std::printf("%d\n", f(std::tr1::bind(g<int>, 1))); }
>>386 C++の型拡張による物は呼び出し側(f相当)を限定してしまうので不可です。
あくまで汎用的なコールバックに使える事が前提なので。
一応nested functionで限定的にできる事は判っています。
>>387 その限定というのは、boost::function (もしくはstd::tr1::function)で何とかなるものではない?
>>388 boost::functionでできそうです。
ありがとうございます。
たまに聞く、GCCは4シリーズより3.4とかの方がアプリなどの動きが早いって聞いて入れてみた。 コンパイルが出来ない物が出てきたから一時は諦めたけど、最近C++関連は(sijc,glibmm,cairomm,gtkmmなど) 全部同じコンパイラーじゃないとうまく動かないというのを知ってその辺全部3.4でコンパイル。 使用してみた感じ、コンパイル(-O2のみ)した各アプリの動きが良い。カーネル2.6.25もGCC3.4でコンパイル。 立ち上がりとかも早くなりました。dmesgの左に出る起動時の細かい時間とかも早くなっているのが解る。 GCCの4シリーズなどは、その新機能を生かすソースを書いてあげないとあまり意味が無いんでしょうか・・・ 快適なのでとりあえずしばらく3.4メインにしようかな。
このスレ見ている人がいるなんてwww 全米も感動(TT)
違いが気になるなら、アセンブリ出力を見比べてみればいい。
アセンブリなんか見るよりアプリケーションベンチ取ればいい。 アセンブリの差はCPU側の処理方法によって優劣付けにくいから。 それにしてもgcc替えてまでやっての感想が「気がします」とは だんだんオーヲタみたいになってきたな。電源ケーブルを純銅にしたら 電気の流れが速くなってキビキビ動作になりました!と変わらん。
>>393 気になるなら調べてください。
調べる気がないなら気にしない方がいいです。
>>393 自前コンパイルなら機種依存オプションまで付けろ、と。
>>397 電源ケーブルは材質よりインピーダンスとアース極性チェックが大事。
信号線の方は俺は純銀ケーブルにしてる。無酸素銅とどっちが良いかはなんとも言えんが。
>>400 うん。そういう風にわかってこだわるのはいいんだ。
>>393 は試したって-O2だけかよ、って小一時間問い詰めたい。
実際のところ、カーネルとかマルチメディア系とかはコンパイラの癖にまで
依存したギリギリのチューニングが施されている場合があるから、
コンパイラの能力を評価するにはフェアじゃない。
毎回gdb立ち上げて特定のメソッドにブレーク張ってとかの作業を 自動化してくれる方法はないでしょうか?
>>404 gdbの起動時にスクリプトを実行する機能があるよ。
詳細はmanでも読んで。
406 :
404 :2008/06/01(日) 03:14:36
>>405 さんありがとうございます。
.gdbinitというファイルをカレントディレクトリに用意して
以下のように書いてうまくいきました。
exec-file ./test.exe
symbol-file ./test.exe
r
b main
gccでコンパイルするときに コンパイルしたソースファイルの名前を、 ディレクトリも含んだ状態でオブジェクトファイルに格納する らしいのですが、 どこに書かれているのでしょうか?
$ nm -a foo.o
June 6, 2008 GCC 4.3.1 has been released.
GCCで音階のプログラムを組もうとおもっています。 波数とパルスの詳細が知りたいので、教えてください。 4オクターブを想定しています。
412 :
デフォルトの名無しさん :2008/06/11(水) 12:28:28
GCCでプリコンパイル済みヘッダ使うとき、元のヘッダ*.hと同じディレクトリに *.h.gchが作られますけど、release用とdebug用の二つのプリコンパイル済みヘッダを 使いわけたいときなんかは、皆さんどのようにしてますか?
*.h 自体を release や debug 用ディレクトリに コピーしてから使ってるなぁ。
ディレクトリ指定してそこに作らせる。
416 :
412 :2008/06/11(水) 22:22:02
>>415 さんのやり方で無事できました。皆さんありがとうございます。
*.h.gchディレクトリ以下で、コンパイルオプションが同じものを勝手に使ってくれるようです。
プリコンパイル済みヘッダのファイル名はなんでもいいようです。
長い間VC6、VC8(MFC)で実装をやってました この度、新しいプロジェクトでlinuxでC++の実装を担当することになったのですが VisualStudioの生ぬるい環境に、長い間どっぷり浸っていたせいで いまいち、調子がよくありません gcc(g++)の環境で、VisualStudioのようなデバッガーって無いのでしょうか?
EclipseもC++に対応してたような
>>418 Thx
Eclipseをインストールして、続けてC++の開発環境もインストールしました
実装に専念できそうです
Eclipse既にインスコしたようだが、Dev-c++もお奨め
eclipse/cdtかkdevelopだな
Emacs以上の環境は存在しない
これがゆとり世代か・・・
emacsはもう死んだよ
Emacs is dead. The future is notepad.
>>424 ん?xyzzy が便利なんですが。CL だし。
emacs憶えたら便利なんだろうって何となく思うけど、 憶えるための最初の一歩を踏み出す気が起きない。
以下のような関数をgccでビルドするとき、 最適化オプションを何もつけていないのに return -1;の部分が最適化されて消えてしまうことってありますか? int func(void) { // この関数が呼ばれた時点でバグなのでデバッグ時は無条件にアサートさせる。 assert(false); // リリース時に万が一呼ばれたときはエラー値を戻す。 return -1; }
gcc -S でソース嫁
>>428 gccは最適化ナシでも簡単なフロー解析(この場合、あからさまに到達不能なブロック)はやっている。
assert() 内部では __attribute__((noreturn)) なファンクションが呼ばれている。
あとはわかるな?
431 :
428 :2008/06/15(日) 15:55:11
>>429 ,430
どうもです。
以下のソースを
gcc -S -o test.s test.c
と
gcc -S -DNDEBUG -o test2.s test.c
とすると挙動がわかりました。
ありがとうございました。
#include <assert.h>
void f(void)
{
assert(0);
int i = 0;
++i;
}
複数の-g系オプションを並べた場合は 後ろの方が強いのですか? gcc -ggdb -gxxx
gcc 4.3,ひどいな…
いつものごとく4.5くらいまで進めば安定するんでないかい。 ということで3.4使いつづけとります。
俺にとって、4.3はC++0xのためだけに存在しているようなもの。
openmpのこともたまには思い出して上げてください
>>438 これはつまり
gcc cxx.cpp
ができるようにするからくりというわけ?
GCC を C++ に移植したいらしい。
The FSF is not writing the code. にワロタ
もういっそJavaでもいいんじゃね派が登場して 混沌としてほしい
444 :
デフォルトの名無しさん :2008/06/20(金) 08:48:26
なんてアグレッシブな!と思ったけどブランチ作っただけでコードはまだか。 内部のモジュール化が進むといいなあ。
JavaでいいならCOINS
GCC 3.4 x86_64 で -mno-sse が効かないんですが、理由が分かる人はいますか? gcc -S -fverbose-asm の出力を見ると、-mno-sse を付けているにも関わらず -msse が有効になっています 実際、アセンブリを見ても SSE 系の命令が出力されています
>>447 それを付けても駄目みたいです
また GCC 4 系ではそれを付けなくても -mno-sse が有効になります
>>446 >GCC 3.4 x86_64 で -mno-sse が効かないんですが、理由が分かる人はいますか?
横な質問なんですけどx86_64でSSEの無いCPUって何ですか?
>>449 あまり詳しいことは書けないけど
XMM レジスタを使わないことが前提のアセンブリコードや CPU エミュレータがあるので
C ソースファイルをコンパイルするときに SSE コードを生成して欲しくない
あるいは浮動小数点演算自体の使用を禁止する運用も可能だけど
その場合、浮動小数点演算を使用しているソースをコンパイルエラーで弾くくらいはする必要がある
-mno-sse2 なんてオプションはなかったよなw
>>451 GCC 4 なら -mno-sse だけで -mno-sse2 -mno-sse3 まで付きますし
GCC 3.4 はそれらを併用しても駄目ですね
gccのことは知らないが、 windowsだとlong modeでFDP/MMX系のレジスタは一切使わない。 スタックフレームもレジスタ優先でほとんど使わないし、 そのとき実数データの受け渡しにXMMレジスタ使ってる。 XMM使うなというのが無理な話状態なのです。
すみません、gdbの質問をしたいのですがここでもいいですか? gdbの中でグローバル変数の一覧を取得(表示)する方法はありますかね? ローカル変数に関してはinfo localsがありますが。
shell から nm 呼ぶってのは無し?
info variables
457 :
454 :2008/07/07(月) 09:49:28
>>455 えっとグローバルなbssとdataのシンボルを見ろということですかね?
やってみたんですが、自分がいじってるプログラムではどうもconstな変数が
textにいるように見えるんですが... ldの挙動をコントロールしているようで。
デバッグのときだけ「普通」にリンクするというのはありかもしれませんが...
>>456 やってみるとなんかエントリーが重複して見えるんですが、そんなもんですかね。
ちなみにinfo localsと違って値を表示してくれたりはしないんですね。
コンパイルをした日時を埋め込む・取り出す方法ってありますか? 今はmake時に引数で`date`なんかを渡す方法を使ってるけど そのdefineを使うソースがコンパイルの対象になっていない限り 反映されないので、いまいち使い勝手がわるいんです
シェルで、日時を何かのファイルに書き込んで、 それからコンパイル。
そのソースを毎回必ずコンパイルするようmakefileを書けばいいのだと思うんだけど
>>460 その方向でやってみます
となると、次はMakefileスレだな
__DATE__ とかないんだっけ フォーマット考えると自分でやったがいいか
all: hoge ・・・・・・・・ hoge: 絶対コンパイルしたいファイルをコンパイル でいいんじゃね?
GNUmakeなら.PHONYとか
ファイルの一番後ろに日付書いといたらいいんじゃないの
466 :
458 :2008/07/12(土) 21:20:32
やっぱ
>>460 の方法はやめました
コンパイルする必要がないときでもmake叩くと必ずコンパイルされてしまう
というのは俺の精神衛生上よくないことがわかりました
コンパイルした実行ファイルの日付をチェックすればええんちゃう?
埋め込むんじゃなく、コンパイルするたびに バイナリのMD5ハッシュと時刻をログファイルに記録すればいいんじゃね。
469 :
デフォルトの名無しさん :2008/07/13(日) 01:02:01
質問です。 インストールしたてのcygwinにgcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) がインストールされているので、gccを最新版の4.3.1にしようと思ったのですが。 configure --prefix=/usr/local とし、 make したら /home/***/gcc-4.3.1/i686-pc-cygwin/libstdc++-v3/include/ext/pb_ds/detail/thin_heap_/split_join_fn_imps.hpp:108: error: invalid use of incomplete type 'class __gnu_pbds::detail::thin_heap_<Value_Type, Cmp_Fn, Allocator>' のところで詰まってビルドが止まってしまいます。 この原因についてご存知の方いらっしゃいませんか?
470 :
458 :2008/07/13(日) 01:33:13
>>468 それも考えたのですが、なんか面倒なので
リンカに頑張ってもらう方法を調べることにします
>>466 それはmakefileの書き方でいくらでも回避できるんじゃね?
最後のlinkする所のtargetの中で依存関係無しにちょろっとccしてしまえばいいんじゃ
cat `date` >> hogehoge とかやって、 strings -a hogehoge とかやると、読めなくもない。
stringsを使わなくても、 tail -c [文字数] hogehoge でもいける。 後から偽の時刻を埋め込まれたら知らんけど。
いずれにしろ -D で渡すのも気に入らないとか、 コンパイラのほうで実現するのは気持ち悪いとか言ってるから、 スクリプトとか他のもので好きなように実現するのがいいんじゃないのか?
%%%%%%%%%%CREATION_DATE%%%%%%%%%%%%%%% とか他にありえない文字列で 領域を確保しておいて、ビルドした後で実行ファイル(ライブラリかも知らんが)を 直接書き換えればいいんでは。
foo: $(shell date).o $(shell date).c:
477 :
デフォルトの名無しさん :2008/07/17(木) 04:56:52
VC++からの移行組です。 VC++のソースをGCCでmakeしようとして、 いくつかの違いのエラーで悩まされてしまいました。 それで、どうやっても解決策・代用策が思い浮かばない点を質問させてください。 this->m_char_table[ (add_unsigned<T>::type)c] = this->m_char_table_index; このように、テンプレートの型をunsignedにキャストして利用したいのですが GCCではエラーとなります。 こういう使い方は出来ないのでしょうか? また代用の方法はないのでしょうか? gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) を使用しています。 よろしくお願いします。
おっおっおっ⊂ニ( ^ω^)⊃ ちょい書き込みtest
あとcの型な。
>>458 __DATE__ __TIME__でいける。
例
const char aaa[] = __DATE__ __TIME__;
482 :
477 :2008/07/17(木) 13:49:10
>>480 cの型はテンプレート(T)です。
基本的には、char、wchar_t、int、shortなどを取ります。
それ以外の型が入れられる事はないようにはなっていますが
基本的には特定はされません。(自分用のライブラリなので整数以外を取る事はありません)
>>479 error: dependent-name ` add_unsigned<T>::type' is parsed as a non-type, but instantiation yields a type
です。役に立ちますでしょうか?
よろしくお願いします。
483 :
477 :2008/07/17(木) 13:52:17
自己解決しました。 そのエラーメッセージの後に note: say `typename add_unsigned<T>::type' if a type is meant と出ており、そのとおりやったら解決しました。 盲点でした。 どうもありがとうございました。
どの辺が盲点なのかと。 英語で書いてあるところか?
つーかそれ、VC++でもエラーにならね? VC++6.0組?
>>485 6.0、2003、2005、2008で試したけど問題にならんよ。
VC++はなぁなぁだからなぁ・・・。
IEとかと同じで、その辺がMSの製品って好まれるんだろうね。
いいとは思わんけど、ちゃんと規格にそってる方が敬遠される状態は勘弁してもらいたい。
いや、この場合はGCCの規格が悪いと思う。
普通に考えればtypenameをキャスト時にするのはおかしいもの。
次に
>>477 が詰まるのは、wchar_tかなw
wchar_tを取りうるって言ってるし。
GCCのwchar_tは欠陥品な上、
文字コードの統一の問題が・・・w
>>487 5.4 Explicit type conversion (cast notation)
8.1 Type names
7.1.5.3 Elaborated type specifiers
くらい読めよ。
あと「GCCの規格」なんてバカな言葉は使うな。
どうせいうなら「GCCの仕様」あるいは「GCCの実装」だ。
wchar_tもいい加減なこと言ってるよなあ。
典型的な、コンパイラとライブラリの区別がつかないひと
いや、GCCの仕様は馬鹿だろ あれほど必要の無い理解しがたい仕様をつめるのは 頭の悪い俺には理解できんよ(笑)
>>489 typename 修飾子って本来ライブラリの管轄じゃないだろ・・・
キャストの問題もライブラリの管轄とは思えんが・・・
wchar_tの話だろ。
>>484 最初からエラーメッセージ張らない人だから、
そもそもエラーメッセージを読まない人なんじゃないかとw
むしろ、エラーメッセージしか見なかったんだろ。 最初の質問で、エラーの内容は理解してると思われる。 ただ、エラー以外をみなかった。ということだろう。 いやね、俺もその傾向あるからわかるんだが コンパイラってだいたいロクなメッセージ伝えてこないから エラーそのものしか見る気しないのよ。そのエラーすら別の箇所による問題によって 引き起こされてたりするので、そのまんま信じるわけじゃないし。 1つエラー出ると、大量にどうでもいいメッセージが出るから、頭の中でフィルタかけないとエラーは解決できない。
寧ろ、そんな発想だからフィルタが必要なんだろ。
497 :
458 :2008/07/18(金) 09:44:05
>>481 そのファイルがコンパイルされた日時ならそれでいいけど・・・
何が望みなんだかわかんねえ
>>497 Makefileで常にコンパイルするファイルをそれにしておけばいいんじゃね
俺もよくわからない。
.oが出来た日時をCのソースから利用したい。
a.outが出来た日時をCのソースから利用したい。
どっちなの? 前者なら
>>481 でFAでしょ?
後者なら
>>464 の方法で出来るよね。
もっと違うこと?
502 :
458 :2008/07/18(金) 13:10:48
>>501 バージョンを取得する関数のあるソースを hoge.c としたとき
hoge.o を他の全オブジェクトに依存させればいいのかな?
やってみるよ。
503 :
458 :2008/07/18(金) 13:15:23
できた。ありがとう
>>501 >>499 コンパイルの必要が無いときはコンパイルしたくないんですよ。
501だが、
>>501 と
>>502 眺めて
30秒考えてようやく仕様が分かったw
>>501 の後者って事だよね。
>>464 の言っている別解だが、
.PHONY: hoge.o
これで「hoge.o is up to date」になることなく、
hoge.oが必要とされれば、タイムスタンプ比較をショートカットして、
毎回ルールに基づいて生成しようとする。で、
a.out: $(OBJS) hoge.o
としておけばいい。
>>504 それソースが更新されてないときでも、生成されね?
a.out が更新されたってことは生成必要なんじゃ?
a.out: $(OBJS) $(COMPILE) $(CFLAGS) hoge.c $(LINK) $(OBJS) hoge.o
BCB使っていて興味本位にGCC触ってみたんですけど 下のコードって通らない、というか間違った書き方なんでしょうか? 環境はubuntuのg++4.1.3です template< typename T > class test { friend class test< T >; <<ここで怒られてる public: int aaa; };
エラーメッセージは? 読んだ?
510 :
508 :2008/07/18(金) 17:38:43
〜 error: class 'test<T>' implicitly friends with itself と出ていました。 英語もわからずGUIでしか操作したことないとGCCなんて使うこと出来なさそうだなぁ。
「自分自身はいちいち宣言しなくてもfriendされてるのと同じことできるよ」と言っています。
ええええ! ・・・実体が違うなら同じクラスでもpraivateに触れないと思ってました。 ありがとう!
なんか .PHONY が誤解されてる気がする。
>>512 ちっとは英語の勉強しようよ。なんだそのスペリングミスは。
わざとじゃねーのか。 さすがにキーワード間違えないだろ
playmateに触れたい
あるオブジェクトファイルがリンクされたかどうかって・・・というか、 あるシンボルの中身が存在するかどうかってソースレベルでチェックできる? 存在しないシンボルを参照してもリンカがエラーを吐かないことが前提で・・・
518 :
517 :2008/07/23(水) 00:47:49
__attribute__((weak_import)) が自分のやりたいことに合致しそうだけど サポートしてるのは MacOS X だけっぽい 諦めてほかの方法を探すかな
何をしたいのかがわからない。 実行時にシンボルの中身が存在するか判定したいんだったら遅延リンクでもいいんじゃね?
>>517 オブジェクトのリンク状況つうのは、
foo.c
#include <stdio.h>
int bar_magic = 0 __attribute__ ((weak));
int is_bar(void)
{
return 0;
}
int main(void)
{
printf("%d\n", is_bar());
return 0;
}
bar.c
int is_bar(void)
{
return 1;
}
とかやって、
$ gcc -o foo foo.c && ./foo
$ gcc -o foo foo.c bar.c && ./foo
の結果が変わるでいいんですか?
522 :
517 :2008/07/23(水) 19:07:38
>>519 質問の仕方が下手ですまん。
最終的には組み込む予定のとある関数を、一時的に外したいが #ifdef などでソースを切り分けたくない。
シンボルの中身の有無がプログラム中から判別できれば、 makefile 側でリンクするオブジェクトを
管理するだけなので楽かなと思った。
>>520 条件の後出しで申し訳ないが、組み込み環境なので動的リンクはちょっときつい。
>>521 weak_import じゃなくて weak で良かったのか。どうもありがとう!
int weak_func(void) __attribute__ ((weak));
/* int weak_func(void) { return 1; } */
int main(void)
{
if (weak_func)
{
dbg_print("Function exist\n");
}
else
{
dbg_print("Function not exist\n");
}
return 0;
}
リンクエラーは解決したか?
524 :
517 :2008/07/23(水) 23:48:01
>>523 俺宛てかな?実はそこが問題になるとはあまり考えてなかった。
中身が無いことを前提にしたシンボル参照をソースで意図出来れば、
当然リンカもエラーは吐かないだろうと思ってたので。(そしてその通りになった)
でも気にしてくれてありがとう。
今後の予定としては、間違えて同名のシンボルを別のソースで定義してしまい
関数が上書きされたことに気づかずバグに苦しむ。というストーリーを計画しています。
GCCのコンパイルがおわらねぇ
まあ環境によっては2日仕事だな
527 :
デフォルトの名無しさん :2008/07/24(木) 18:37:23
マジか… 400MHzのアナルスペックで3時間くらい放置してる絶望
余計なの削除してやり直すか…
>>525 もし余ってるマシンがあるなら、distccで分散コンパイルとかどうよ。
C++だとエラー出まくりで、コンパイルできなかったりするけど。(これは俺の設定が悪いのかな?)
make LANGUAGES=cで放置 メインのPCは修理に出してしまったから、400MHzの一台しかないんだよ… やっと3時間くらいでstage1が終わったから、朝までつけっぱなしで終わりそうかな マルチコアCPUなら-j 2とか付けたいんだけど…
>>530 ひとつでも-j 2はこうかてきめんだよ。
HDDに書いてる間CPUひまだし
今まで-jなんて知らなかったorz クアッドコア使えるのに。
な、なんだってー(AA略
ーj10
軽く15年前からあるオプションだよなw
エラーでるわ 素直にバイナリ落としてきた
537 :
デフォルトの名無しさん :2008/07/25(金) 20:03:33
C言語で書かれているプログラムをAlphaの命令セットで実行できるように クロスコンパイルするにはどうすればいいのでしょうか まず何が必要なのでしょうか? とりあえずGCC,binutil,glibcを用意してみたのですが…
gccやbinutilもってきたなら中のドキュメント読めば、つーか configure --helpすれ。
>>541 もしかして:
www.bitesex.com
>>541 vmware に NetBSD 入れて /usr/src/build.sh -m alpha tools
545 :
544 :2008/07/27(日) 19:38:37
>>541 って、すげードメイン、か。すげーめんどいん、に見えた。
逝ってくる。
すげーメイド!
いろいろアドバイスありがとうございます とりあえずGCC,binutil,glibcだけでなんとかなるor541の方法ってことでOK? binutils入れてみようとおもったのですがconfigureで HOST=~には使っているマシンの 状況を書けばいいのかな? それともプログラムのバイナリを実行させる先の 事をかけばいいのか… HOST=CPU-COMPNY-SYSTEM ってことらしのですが CentOSでPentium4のマシン使っている場合だとx86-centos-linuxで いいんですかね?
>>547 カナディアンクロスやるんじゃなければ
ホストは configure が勝手に発見してくれるので
/path/to/configure --target=
で桶
いろいろほげってダメだったらまた濃い
549 :
548 :2008/07/29(火) 00:50:02
ちなみにこのへんの GNU toolchain は カナディアンクロスもある程度考慮されてるので "Linux ホストで、MipsターゲットのCygwinバイナリを作る" てな感じも(必要な知識があれば)可能。 ↑経験談
GCCは変態だなぁ(褒
クロスコンパイルはGCC & binutilsの独擅場だからねぃ
このスレには優しい神が宿っているようだ。
4.3.2
GCCは最高のクロス開発環境だなあ
GCC に #pragma optimize はないんですよね? ある大きな数値計算プログラムがあって、 全体としては -O や -O2 など最適化はしたい。 けど一部、計算誤差などを考慮した、 計算の順番を変えてほしくないコードがある。 Intel Compiler などは pragma でソコは最適化しないように 回避できるんだけど、GCC はどうしようかと。 なんか手段あります? ソースを分けて、そこだけ -O0 にするしかないのかな?
> ソースを分けて、そこだけ -O0 にするしかないのかな? と思う。
556とは別人なんだがinline関数なんかの場合はそこだけコンパイラオプションを変えるわけにもいかないし 精度は保ちつつ最大限速くしてもらいたいからvolatile使うのも嫌だしとワガママ言ってしまうことはあるね。 Cを高級アセンブラとして使っているときに 局所的に自分でスケジューリングした順序で動いて欲しいこともあるし。
>>556 研究や業務で使う道具としては悩むよりもicc使っておいた方が良い場合に該当するんじゃなかろうか?
volatile とかうまく使えないんだろうか
562 :
デフォルトの名無しさん :2008/09/02(火) 07:14:38
GCCでもPGOであるんですか?
最近のならあるよ -fprofile-generate/-fuse-profile
まちがえた-fprofile-useね
フリーなのにすごいですね…
実績だけは(アーキテクチャによっては)存分にあるからな。
567 :
デフォルトの名無しさん :2008/09/03(水) 02:16:10
__artificial__アトリビュートを調べていたら、下のドキュメントが あったけどなんかいまいち理解できん。 わかりやすい日本語で解説してくれ! artificial This attribute is useful for small inline wrappers which if possible should appear during debugging as a unit, depending on the debug info format it will either mean marking the function as artificial or using the caller location for all instructions within the inlined body.
この属性は小さなインラインラッパー関数に使いよい。 その関数とはどういうものかというと、デバッグ中には 関数の中に入らずに単体として扱われるのが望ましいもの。 この属性がどう実現されるかというと、 デバッグ情報フォーマットによるが、 関数にartificialというマークをつけるか、 またはインライン化された関数本体中の呼び出し位置を使う (どう使うのかは書いてない)ことになるだろう。 ……と理解した。 デバッグの必要のないような機械的に生成したラッパーインライン関数 なんかに使うといいんでないのかしら。
$(GCC)/gcc/config/i386/emmintrin.h みてね。
570 :
567 :2008/09/04(木) 00:45:24
>>568 よく分かった!ありがとぅ!
>>569 まさにそれを見てて気になったんで調べてた
とりあえず、*mmintrin.h は非常に使いづらいんで
自前でラッピングしようと思った次第。
それにしても、GCCのアトリビュートは書きにくい。
アトリビュートはC#の書き方がいい感じ。
[Align(16)]
int hoge = 12;
とか。
gccの方が何に掛っているかはっきりする。
gccでコンパイルしたバイナリを販売したらダメなんだろ? イミネー
いや、コンパイルしたもの自体は問題にならない。 GPLなソースが混入してない限り。 だがそれが回避しにくいように念入りに作られてるんだわこれが…
それと仮にGPLだったとしても、GPLなら販売禁止ってわけじゃないよ。屁理屈みたいだけど。
>>573 作られてない。そもそもふつーにコンパイルする範囲ではGPLの影響は受けない。
お前のプログラムにGPLが感染するのは、コンパイラ関係無しにGPLのコードを混入させたときだけだ。
>>572-573 なのこの頭の悪いしったか連中…
libcがGPLのときのバイナリと混同でもしているのか?
4.4がstage3になったのか。
リリースは来年ですかねえ。
>>577 libgccが例外なしGPLとか。
In addition to the permissions in the GNU General Public License, the Free Software Foundation gives you unlimited permission to link the compiled version of this file into combinations with other programs, and to distribute those combinations without any restriction coming from the use of this file.
GNU一般共有使用許諾における許容に加えて、フリーソフトウェア基金はこのファイルのコンパイルされたバージョンを他のプログラムへの組み合わせにリンクして、このファイルの使用から無制限に来るそれらの組み合わせを広げる無制限な許可をあなたに与えます。
しかし、このスレは定期的にGPLの話がでるな。 とりあえず、 ・GLPのソースを含んだ実行ファイルから利益を得ることは制限されない。 ・ただ、ソースを見せろと言われたら全て見せなくてはならない。 ・それは不便だからLGPLがあり、その場合は以下の条件を満たせばソースを 見せる必要はない。 ・使用しているLGPLなソースを第三者が修正して、再度、配布しているもの と同等の実行ファイルを作成出来なければならない。 ・ダイナミックリンクの場合は特になにもする必要はないが、 スタティックリンクの場合は、リンクに必要なオブジェクトファイル (具体的には、*.o)を提供しなければならない。 ・同等の実行ファイルを作成出来ることが必要という縛りがあるので、 LGPLだからと言ってこっそりコピペするのは(・A・)イクナイ!! (結局ソースを提供しなければ同等にならない可能性があるので。) と理解している。
GPLのプログラムがLGPLのライブラリを読み込んだとき、 LGPLのプログラムのソースの公開の義務は発生しますか?
GPLのプログラムとリンクした時点で、ライブラリもGPLになります
>>583 なんですとぉ!
自作ツールでアーカイバプロジェクトの
スタティックライブラリをリンクしたとする
自分のものでもないしソースもないけど勝手にGPL?
d3d9x.lib とかスタティックライブラリじゃん
困らね?
おいおい、めちゃくちゃだな。
>>582 GPLのプログラムもLGPLのプログラムもソースを公開する義務がある。
悩む必要はまったくない。公開してくれ。
>>584 その自作ツールのライセンスはなんだ?
ソースを公開したくないんだったら、LGPLのライブラリをリンク
してれば大丈夫だ。ライブラリがGPLの場合は無理。
> d3d9x.lib とかスタティックライブラリじゃん
> 困らね?
それはまた違うラインセンスになってるだろ。
詳しくは知らんが、それをちゃんと調べるべき。
>>584 全体をGPLにできる場合のみ、GPLのコードを基に著作物を形成・複製・頒布することが許諾される
条件を満たせないなら、GPLの使用許諾は得られない
>>584 勝手じゃないだろ。使うソフトウェアのライセンスは読もうよ。
非GPLなプログラムからGPLなライブラリを使うときは 非GPL部分とGPL部分とでプログラムをわけて、 ソケット通信をすればおk まあGPL部分は諦めて公開する必要があるけど どうしても非公開にしたいコアな部分は非GPLにできる。
>>584 いや、d3d9x.libってCygwinかなんかの?LGPLなの?
困るんならMSのライブラリとコンパイラ使いなよ。
または、d3d9x.lib相当の機能は、自分で作らないと。
他人の成果物使ってんだからさ。
ライセンスに従えない人間に使われるのてむしろ困るのは、
ライブラリを作ってる側だし。
>>588 そのソケット通信は確実に白なの?
前にそんなことが議論になったみたいだけど、
結論がどうなったか知らないんで。
>>588 の例だとGPL部分が不可欠ならばリンクしてなくても
派生物としてソースを公開する必要があるという議論だったと思う。
>>589 プロプライエタリなOSにGNUな開発環境を存在させるため
OSが提供するライブラリに関してはプロプライエタリでもGPLの公開義務の
対象外。
分かりにくいなぁ。GPLって。 このライセンスは、GNUが本来目指していた目的に合致するのだろうか・・・・
本来の目的って、すべてのソフトを未来永劫にわたってオープンソース化する 超過激思想だぞ? だからこそこんな感染性のあるライセンスにしたわけで。
そのへんは「オープンソース」界隈の連中が意図的にか天然か 勝手に話を混ぜ込んでいたりするからなw
>>592 根本はとってもシンプル
結局はバイナリ公開したければソース出せボケ
いろいろな抜け道を塞ぐために条文追加するはめになっただけのこと
ストールマンの最初の動機と何も変わってないw
思想先行どころか実利的なGPL
>>591 d3d9x.libはOSのライブラリってこと?スタティックなライブラリが?
話が唐突で全然意味がわからん。
てっきり、GCC用のLGPLなライブラリだと思ったんだが。
あと、GPLならGPLが適用されるし、LGPLならLGPLが適用されるっしょ。
OSがプロプラとか関係無い。
すくなくともd3d9x.libについて調べればそういう話は出てこないとおもう。 簡単に言えば、Direct3Dについてくる、MSの3Dライブラリみたいな。
例えば、GPLな数値計算ライブラリと Direct3D の組み合わせで計算結果を視覚化するソフトウェアがあるとする このソフトウェアを α とする α 内で使用されている D3DX* 系の関数は DirectX SDK の d3dx9.lib スタティックライブラリに含まれている スタティックライブラリに含まれる部分のソースが無いので 出来上がった α を頒布することはできない これで合ってる?
>>591 それが詭弁に過ぎないことは世の中のWebブラウザを見てればわかる
601 :
599 :2008/09/07(日) 21:11:52
>>599 はgcc関係なくて、GPLについてだけなのでスレ違いっぽいですね
mingwのgccがなかなか4系列にならないのはなんで?
>>603 4系列だとpchのテストが通らないからとか?
>>598 あー、d3dx9.libの事を言いたかったのか。
てっきり、d3d9x.libっていうCygwin用のdllラッパーか何かかと思った。
じゃあ、
>>584 は何を困ってんだ?自作ツールを公開したいってことか?
d3dx9.lib ってスタティックリンクライブラリなの? DLL用インポートライブラリじゃなくて?
607 :
デフォルトの名無しさん :2008/09/08(月) 13:48:05
スタティックリンクライブラリ
そうなんだ。Thx!
GCC4.4 が stage 3 になったな
どちらにしろOSの機能を使うためにOSベンダが提供しているものは使って大丈夫。
GPLの何項にのってるの? >どちらにしろOSの機能を使うためにOSベンダが提供しているものは使って大丈夫。
612 :
デフォルトの名無しさん :2008/09/09(火) 07:41:32
>> 611 ちょっと前のレスも読めないの?
>>612 >>611 はGPLを読んだことすらないだろ。読んだことがあるなら
述べる主題によって項が立てられているのだから
>>611 みたいなこと
いちいち聞くまでもないと理解しているはずだから。
組込み以外で、何度もオブジェクトを小グループ単位で スタティックリンクし、最後にlibxxxx.aを作る利点というと 何が思いつきますか
libxxxx.aを作るのはスタティックリンクちゃいますえ
libxxxx.aの中の関数を置き換えられる
C++のコードを-Weffc++を付けてコンパイルしたら、警告が出まくった男がいたんですよー。 よく見るとSTLのヘッダーファイルから発生してるやないかー 俺のせいちゃうやんけー 男は黙って ただの配列
618 :
デフォルトの名無しさん :2008/09/28(日) 18:19:32
export CPPFLAGS="-fprofile-genereate" export LDFLAGS="-fprofile-genereate" make PGOつかいたいんですけど、 上のとおりにやったらcc1.exeっていうのが -fprofile-genereateなんてしらねーよ!って怒るんです。
そりゃそうだろ。
620 :
デフォルトの名無しさん :2008/09/29(月) 03:46:49
gcc (GCC) 4.1.2(Linux)では、 構造体の代入はmemcpyを呼んじゃうもんなんですか? 32bitマシンでは4バイトずつのコピーを期待していたので。
>>620 gcc 4.3 or laterを使いましょう。
gcc って、-g で最適化(-O2など)が阻害されるようなことがあるの? ずっとないと思ってたけど、気になってきた。
623 :
デフォルトの名無しさん :2008/09/30(火) 08:33:04
genereateってどういう意味だw
ニートだから最後は延ばしたくなるんだろうな。
fprofile-genereateの検索結果 2 件中 1 - 2 件目 (0.52 秒) もしかして: fprofile-generate
630 :
デフォルトの名無しさん :2008/09/30(火) 15:12:33
632 :
ニート009 :2008/09/30(火) 22:34:27
stripって何?
実行ファイルからデバッグ情報を取り除くこと
634 :
デフォルトの名無しさん :2008/11/03(月) 13:41:03
sh4-linux を組み込む クロス環境を作成中で、 binutils-2.19 ← 成功 gcc-3.4.6(ブートストラップコンパイラ) ← 成功 glibc-2.5 ←ここでこける 完全なsh4-gccの構築 ← ここへはたどり着けない CC=sh4-linux-gcc ac_cv_type_long_double=no ../glibc-2.5/configure \ --host=sh4-linux --prefix=/root/sh4/tools/sh4-linux/ \ --enable-add-ons=linuxthreads --with-headers=/root/sh4/tools/include/ \ --disable-sanity-checks --disable-shared | tee sh4config.log configureは成功するよ makeすると・・・・ /root/sh4/tools/bin/../lib/gcc/sh4-linux/3.4.6/../../../../sh4-linux/bin/ld: cannot find -lgcc_eh 上のエラーが出てmakeが途中でストップ。 gcc-ehとはldによって呼び出されるもの?と思いました。 どのような役割があるのでしょうか? gccコンパイルする時に生成されなかったのかな? 既存のshクロスrpmをインスコすればいいのですが、クロス環境の学習目的です。 参考書籍は「組み込みlinuxシステム構築」を読んでます よろしくおながいいたします。
crosstoolとかcrosstool-NGのスクリプト読んでみるといいよ
まだうまくいかないけど、参考になりました。 コンフィグオプションももっと調べないと・・・
gcc の引数って順番の依存あります? gcc hoge.c mylib.a と gcc mylib.a hoge.c ってかいたとき、Darwin の gcc だとどちらの書き方でも a.out ができるんですが、 Ubuntu の gcc だと、後者の書き方ではリンクエラーになるんです。
順序に意味はあります。 リンク時の名前解決において、先に現れたモジュールで未解決の名前を、 後で現れたモジュールで解決するので、これが逆になって、 先に現れたモジュールに定義があって、後から参照する形になると、 名前が解決できなくなります。
>>639 Darwinのgccはldとは別のリンカ使ってる。(dyld)
DarwinはELFやBSD a.out形式じゃないから。(Mach-O)
>>642 pchの問題は4.3だと解決してるみたい。
OS CentOS4.6 i386 gcc 3.4.6 やりたいこと binutils-2.10.tar.gz gcc-2.95.2.tar.gz glibc-2.1.3-armlinux.tar.gz を使ってクロス環境を作りたい bintilをビルドする時に ./configreでホストのタイプを設定したいのですが、Centの場合 --host=i386-unknown-linux でいいのでしょうか?
binutilsとgccはとくにhostの指定はしなくてもいいけど
書くとすれば、i386-pc-linux-gnu だよな。
gcc -dumpmachine
OS:CentOS コンパイルすると 無効なプリプロセスディレクティヴ #! ってでるんだ 誰か解決策を教えてください。
エスパー求む
シェルスクリプトをコンパイルしてはいけません
実は1行目が#!ccだったりしてw
g++のコンパイルが異常に遅くなってしまってるんですが、 何がボトルネックになっているのかを調べる(コンパイラ自身のプロファイルみたいなの) はありますか? コンパイルしているのは、ユニットテスト的なテストプログラムで、 長さも100行程度です。ひたすら関数の結果をチェックしまくるみたいなもので、 マクロを使いまくっているんですがそれが原因かなぁ・・・
書き忘れましたが、その100行程度のユニットテストプログラムで、 コンパイルには3分くらいかかってます。 本体プログラムよりはるかに長い・・・orz
可能なら前半と後半で2つのモジュールに分けて、どっちで遅くなるか調べる。 それを繰り替えして突き止めるとか。最終手段かもだが。
-Eだとどれくらいかかってるんだろ?
1. -E, -S, -cでそれぞれの時間を確かめる。 2. cc1内部は-fdump-rtl-allで出力ファイルのタイムスタンプを見る
templateでたらいまわし関数みたいなものを作っているとかだったり。
>>658 テンプレートをガンガン使ってるなら、まぁ遅くなっても納得するんですが・・・
コンパイルしているプログラムが、
ASSERT_TRUE( .xxxx )
ASSERT_TRUE( yyyy )
みたいなものが延々と続いているだけのプログラムなので不可解なのです
time コマンドで実行時間を測定しました。 -c 81.34s user 12.30s system 97% cpu 1:35.78 total -S 82.63s user 11.62s system 99% cpu 1:34.66 total -E 0.36s user 0.17s system 99% cpu 0.533 total それぞれ一回しかやってないのでちょっと揺れがありますが… つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか? ひょっとしてプリプロセッサによってファイルが膨れ上がっているのかとも思いましたが、 他のファイルでも-E 後の行数はほぼ同じだったので、単純に行数が原因ではないようです。 (すべて 50k〜60k行の範囲内) 次に-fdump-rtl-allを付けてコンパイルしようとしましたが… ディスク領域不足でコンパイル中断しましたとか出る上に30分経ってもまだ終わらない…
アサートの数を減らしてみて どこを減らせばどのくらい時間が変わるか見てみたら?
> つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか? どう見てもcc1だろ時間かかってるのは。 -Q ってオプションがあるので試してみ。
-Sの時間が-cよりかかってるってことは、コードが相当大きくなってる?
プリプロセスだけして出てきたコードはどれくらいになっとるかね
どんな最適化しているの? でかいファイルでインタープロシージャルな最適化まで やったら結構重くなるだろ。
>>663 これは誤差範囲だと思います。一回しか測定してないので
>>662 -Q を試してみます。
#if 0 したりしていろいろ測定してみました。どうも、ASSERT_XXXXの個数と
だいたい相関があるようなので、1つ1つのコンパイルが遅いような気配です。
マクロの中身を減らせないかどうか検討中です。
アサートマクロの実装がマズかったりすんじゃないのかね。意外と。
>>664 プリプロセス後のコードは50k行程度です。
一般的に見て多いのか少ないのかよくわからないですが、
他の、数秒でコンパイルが終わるような同列のソースファイルも
行数はさほど変わらないので、行数そのものは関係ない気がしています
>>665 autoconfまかせだったので、-O2の最適化がかかってました。
テストコードだし、-O0にしてみます
>>668 ヘッダファイルの部分を除いた行はどのくらい?
あと、マクロは常に1行に展開されるので、
単に行数だけ見るより、バイト数見た方がいいかもしんない。
>>660 システムタイム大きすぎ!ほとんどI/Oだろ。
-vでcc1の引数見て、テンポリファイルの中見てみ。
超巨大になっているに違いない。
もしかしてtemplate引数に正定数の荒しで特殊化爆発?
-pipe してみて改善するようなら、特殊化の嵐でオブジェクトサイズがとんでもないことになってて I/Oで時間喰ってるんじゃない?コンパイル中にメモリとスワップがどうなってるか見てもいいかも。 今時のマシンでcc1plusに80秒以上とか・・・。gccのinsn-*.cのコンパイルはそのくらいかかってたけど。
gdbでさ、 struct foo; struct foo { ... }; と構造体の前方宣言があると、先に見つけた定義を見てしまって構造体の中身を print でダンプできず <incomplete type> になってしまうのだけど、結局 これって解決不能なの? 毎回同じ構造の別名構造体をダミーで仕込んで、変数ごとにキャストして アクセスとかって超面倒なんだけど。
673 :
670 :2008/12/22(月) 09:53:03
まさに的を射たと思ったんだが反応がない(ワラ
>>673 反応遅れましたが、前にも書いているとおりテンプレート一切使ってないんです。
(boost::scoped_ptrは使ってますが、それはほかの異常ない部分でも一緒なので)
特定のどこかが遅いということではなく、調子のってマクロを使いすぎて
ソースの量が爆発しているような気配です。
地道にマクロを削って最適化を抑止して頑張ってます。
>>672 ちょっと簡単な例でやってみたら別に問題ない。 具体的なサンプルコードよろ。
gdbはinfoのどこかに、関数のプロトタイプ宣言書くなら、 ファイルのはじめの方に書きなと書いてあって笑った記憶があるが…
>>678 古い記事を出してしまったのはすまない。
最近(2006年あたり)でも類似の話があるので出してしまったのだけど、
ちょっと込み入った話なので質問撤回します。お騒がせしてすみません。
EclipseからMinGWを呼び出してC言語のプログラムを書いているのですが、 "-ansi"オプションを指定しても、なぜかC99の機能が使えて困っています。 具体的には、配列の動的確保がなぜかできます。(↓のような機能) int i = 10; int array[i]; 他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので これはバグなんでしょうか? ちなみにgccのバージョンは、「gcc (GCC) 3.4.5 (mingw-vista special r3)」です。
>他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので むしろこっちの方がバグなんじゃ
-ansi 指定してもその程度なのか。 やはり -pedantic-errors -Wall をつけないとダメなのか。
バグ呼ばわりか
他のコンパイラで使う時に困るので、けったいな独自拡張はやめて下さい。
688 :
680 :2009/01/18(日) 16:38:49
>>681 できたと思ったのですが、またもや可能になってしまいました。
どうやらMinGWではなく、Eclipseのプラグインにバグがある気がします。
お騒がせいたしました。
だからpandanticだって
>>688 -std=c89 -pedantic-errors -Wall
691 :
680 :2009/01/18(日) 16:52:34
>>689-690 ありがとうございます、今度こそ表示されたようです。
レスも良く読まずにすみませんでした。
全ては自分以外のバグが原因だからなw
しかもレスもよく読まない。
4.3.3
gcc 4.3.3のビルド・インストールをしたのですが、 間違えて、prefix=/usrにしてしまっていたのですが、 一度、アンインストールしたいのですが、 どうすればいいでしょうか?
以前入れてたバージョンを再ビルドすればいいんじゃねえの?
>>695 GCCにあったかどうか記憶してないけど
make uninstall
が効くかもしれない
>>695 もう一回make installして、何をinstallしたかファイルに保存
↓
手作業
cppに依存しているものも結構あるから、
普及する前にrebootしない方がいい。
その作業を自動化するスクリプトって書けそうだけど
INSTALL変数を上書きすればいいと思うけど、 まあ結局、目でチェックする必要あるから。
/usrにある既存環境上書きしてるはずだから、単純にアンインストールすると酷い目に合いそうな気が。 1) インストールされたファイル/ディレクトリの一覧を作る。 2) 標準のパッケージでインストールされるファイル/ディレクトリの一覧を作る。 3) 標準のパッケージを再インストール。 4) (1)に有って(2)に無いファイル/ディレクトリを消す。 これくらいやる必要あるんじゃない?
>>698 にあるcppと
C++もインストールした場合のlibstdc++くらいじゃないかな。
システムのクリティカルなところに使われてる可能性あるのは。
ld, libcは入ってないし、crt関係はsoじゃないし。
>>695 ちなみにGCCのmake uninstallは効かない。それとprefix=/usrだったらまずディストリ標準の/usr/bin/gcc同じくg++,c++や
cppやgcjなどが完全に上書きされてる。フォートランは違う名前かもしれん。
一番問題は多分/usr/libのlibstdc++が上書きされてる点かな。下手するとgcc4.3入れたその前後にmakeしたアプリなどが
動かなくなるかも。てか運が悪いと既にそこへ入れた時点でlibstdc++の関連で動かなくなるアプリとか出るときあるお。
結果から言うと自分で手作業で探して削除した後、再度デフォルトで入ってたgcc系とlibstdc++のパッケージを再インスコ。
ぶっちゃけ手作業で削除しなくても多分gcc系とlibstdc++の再インスコで上書きされるから平気だと思うよ。
ただしgcc系ってのはgcc,c++,cpp,gcj,fortlanあとなんかあったような気がするけど忘れたw まあその辺全部再インスコね。
そうすれば手作業で消さなくても問題無い位復旧できるはず。
まあ違うバージョンのgccは/optとかにインスコしといた方が無難。/optにおいてもldがちゃんと機能してればlib関連は
/opt/gcc***/libを見に行くはずだから。
OS再インストールした方が早かったりしてね。
基本的に複数バージョン同居できるようになってるからそこまで大変じゃない。 パッケージからgcc関連入れ直して/usr/include/c++/4.3.3、 /usr/lib/gcc/$target/4.3.3、/usr/libexec/gcc/$target/4.3.3を消せば大丈夫。
>>706 向こう見に行くの面倒だから、聞きたいポイントを整理して書け。
お疲れ。 double func(double a, double b){double c; return (a+b);} でreturn (a+b); とc=a+b;return c;の違いは何?
>>708 浮動小数点な数値のプロセッサ内での保持方法の差だっけ。
どっかのブログでSunの科学計算の手引きみたいなページが紹介されてた。
どうやら、fld dword ptr 抜けが原因らしいです。 gcc version 3.4.4 (gcc Win/on Win2000) では、戻り値がdoubleの関数は、return 文の所で 演算していはいけない。必ずglobalかlocalの変数に結果を入れてから、 return 変数名; としないと、いけないようだ。
>gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) 無問題。
gcc に-O3 のオプション付きでなら良いみたい。
714 :
712 :2009/02/07(土) 15:14:01
つけてもつけなくても8228.cで問題が出ない。
715 :
713 :2009/02/07(土) 15:29:08
そうですか、こちらのPCはLavie C LC60H 確か32bitです。 exeか、逆アセンブル結果でも、掲示板に張って送ります? -O3 無し =7>===== 00401050 push ebp 00401051 mov ebp, esp 00401053 fld qword ptr [ebp+10h] 00401056 fadd qword ptr [ebp+18h] 00401059 fadd qword ptr [ebp+20h] 0040105C pop ebp 0040105D ret
716 :
712 :2009/02/07(土) 15:53:53
それの何が問題だと言いたいのか判らない。 --8228.s:total() _total: pushl %ebp movl %esp, %ebp fldl 16(%ebp) faddl 24(%ebp) faddl 32(%ebp) popl %ebp ret -- 確かに-O3つけたらインライン展開されるから関数自体見えなくはなるけど。
717 :
713 :2009/02/07(土) 16:01:34
fadd した結果が消えて、return値にセットされているか? fadd の次はpopなので、結果の値が消えるのでは。
はぁ? 何を寝ぼけたことを。
・faddした結果はどこに格納されるか ・pop ebpは何をどこに戻すか ・doubleの戻り値はどこに格納されるか 少し勉強してこい。
720 :
713 :2009/02/07(土) 16:28:54
すみません。 それで、問題はfunction側に有るのでは無くて、call側です。 戻ってきた直後で、ストアじゃなくてロードすると、以前の内容が レジスタから消えます。 -O3 無し 00401400 call 00401050h 00401405 fld qword ptr [ebp-10h]
fldはプッシュなんだよ
>>720 数多の天才が気付かずに使っているコンパイラのバグを、浅学無能非才のあんたに見つけられるというのか?
思慮が足りないにも程があるぞ。
Cのソースは?
725 :
723 :2009/02/07(土) 17:23:24
で、結局何がしたいんだ? デバッグだったら一人で勝手にやってろよ。 勿論、その場合はスレ違いだ。
gccに-O3オプションは必須か?
>>727 質問の意図は? >723の言っていることなら只の世迷言だから無視しておけ。
730 :
711 :2009/02/07(土) 19:05:31
どぞ
ソートでスタック喰いつぶしるような?
732 :
711 :2009/02/07(土) 19:57:07
戻り値を一旦変数に代入すれば大丈夫?
354 :325 :2009/02/07(土) 04:54:11
>>326 double a;
do{
while((a=total(st[pl])) > x) pl++;
while((a=total(st[pr])) < x) pr--;
355 :325 :2009/02/07(土) 05:01:10
>>326 double a;
do{
pc = (pl + pr) / 2;
if((a=total(st[pc])) == key)
return pc;
else if((a=total(st[pc])) > key)
いいえ。8828.cがまともに動かないのは自前で実装したクイックソートが腐っている所為。
total関数をコメント側のコードにすると動く。
結果がスタック渡しなのに、結果をスタックに書き込んでないからみたい。
>結果がスタック渡しなのに いいえ、FPUレジスタ渡しです。
だから、FPUの勉強してこい。FPUレジスタはFPU内部(と言っても今や単にCPU内部だが)で スタック上に利用するようになっている。だからfldを繰り返したら複数のレジスタに順に格納されるわけ。
740 :
713 :2009/02/07(土) 22:36:24
>>733 参考にしました。結局、gcc 3.4.4はdoubleを使うと「ときどき」桁落ちする。
double total(){return (st.ascore + st.bscore + st.cscore);}
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h] ;;結果はFPUスタックに置く(80bit値)
0040105C pop ebp
0040105D ret
if(st[pc].number == key)
00401153 call 00401050h
00401158 fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115B fxch st(1)
0040115D fucompp ;;数値比較(80bit値 : 64bit値)
double a;
if((a=st[pc].number) == key)
00401153 call 00401050h
00401158 fstp qword ptr [ebp-18h] ;;メモリ内容をFPUスタックから出す(sp=sp-1)(64bit値)
0040115B fld qword ptr [ebp-18h] ;;メモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115E fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
00401161 fxch st(1)
00401163 fucompp ;;数値比較(64bit値 : 64bit値)
return (st.ascore + st.bscore + st.cscore); と double a = (st.ascore + st.bscore + st.cscore); return a; では、吐く汗のコードに違いがあるのですが、何が違うのでしょうか?
return (st.ascore + st.bscore + st.cscore); 結果の戻り値の数値が80bit表現 double a = (st.ascore + st.bscore + st.cscore); return a; 結果の戻り値の数値が64bit表現
なるほど。なんとなく、わかりました。
GCC関係なく、x86一般の話のようにしか思えない。
745 :
706 :2009/02/08(日) 02:51:15
うぜえ
747 :
デフォルトの名無しさん :2009/02/14(土) 06:48:19
gcc -S でコンパイルしたときにコンパイラオプションをアセンブラソースに出力する オプションってありますか?
-fverbose-asm
gcc *.c -S とするとAT&T Syntaxで*.sができますが、Intel Syntaxで出すことはできますか?
-masm=intel 間違った命令を吐いてしまうという噂を聞いたことがある。 最近の状況はわからん。
753 :
750 :2009/03/06(金) 23:58:24
生成コードが心配ならgccには普通にオブジェクト作らせて、objdumpに 欲しい方のシンタックスでダンプさせるのはどう?
そっちもおかしかったりして。 てことはないと思うが、読みにくくなるからなあ。
そもそも噂ってなんだよ?w 毎週snapshotが出て、全世界で最も多く使われているコンパイラが、 判りやすいbugをいつまでもほっとくわけ無いだろ。 最も多く使われている筈のOSは、10年もディレクトリ掴んだまま 放さないbugが取れなくて、たまにイライラするけどな。
masmバックエンドって使われてないだろうし
組み込み系で結構使われてますよ。> masm=intel まあnasmでなんとかなる昨今ですが。
>>767 なれりゃAT&Tでも特に困らんしなあ。
あれは完全におまけ機能だよなあ。
>>768 たぶんそのmasmは関係無いと思う。
>>759 gcc -masm=intel → 組み込み評価ボードのアセンブラ(by Intel)
64bit環境で gcc -O2でコンパイルする場合と gcc -m64を付ける場合でゲロったバイナリの内容って異なることは ありえないですよね?
ありえるのでは? gcc -O2とgcc -m64 -O2が違うのはあり得ないというのならともかく。
4.5
gccで未使用のシンボル削除するオプションってありましたっけ 10バイトでもメモリ節約したいので何かあれば教えてください
リンカじゃないのかそういう仕事って
どうぞ教えてください x86 + Linux + gcc でクロスコンパイル環境を作って AIXやSparc-SolarisやHP-UXなどのプラットフォームで 動く実行形式を生成することはできますか? 日本サイトにはそうした情報がない気がしました
>>767 きっと可能。
場合によってはGCCのソースを書き換える必要もあるかもしれない。
何にしても、ターゲット環境のライブラリもコンパイル環境に持ってく
る必要はあると思う。
769 :
767 :2009/04/10(金) 13:56:40
>>768 ありがとうございます
でも、それを実現する方法がネットで見つからないです
SHやARMなどのマイコンへのクロスコンパイルの情報ならあるのですが・・・
もし何かご存知の情報があったら教えて頂けないでしょうか
書籍でも、海外サイトでも、なんでもいいです
>>769 HP-UXは兎も角、SparcSolarisをクロスで開発する理由が判らん。
それはさて、クロス開発環境には通常、エミュレータが必要になってくるわけだが、
そんなことするくらいならgccをポーティングした方が融通が利くんじゃないのか?
>>769 gcc/binutilsが対応しているターゲットなら
基本的な手順はそういうのと同じ。
772 :
767 :2009/04/10(金) 14:31:25
>>770 AIXやHP−UXやSparc-Solarisの3台の開発マシンを
買うことが出来ないので、そうしたいです
プログラムを動かすAIXやHP−UXやSparc-Solarisのサーバは
顧客から提供されます
(開発マシンは提供されない契約です)
x86 + Linux + gccのクロスコンパイル環境で
AIXやHP−UXやSparc-Solarisのバイナリを
生成できたら、とても助かるのですが・・・
もしご存知でしたら、どうぞ教えてください
HP-UXはhpのリンカが要るから断念した希ガス
仮にできたところで、本番環境でのテストができないのはどーすんの? 一発完動で本番稼動させるつもり?
775 :
767 :2009/04/10(金) 14:54:27
>>774 プログラムを動かすAIXやHP−UXやSparc-Solarisのサーバは
顧客から提供されます
開発マシンは提供されない契約です
保守があるので
永続的に開発環境を作っておく必要があります
でも、開発マシンをレンタルやリースするお金はありません
大手企業とちがって、小さいソフトハウスなので、
こうした条件でしか受注できないです
つらい仕事だw
その顧客は純正開発環境使わなくても納得出来るのかなあ ターゲットに適した開発環境が無いってのなら判るけど仕様書が心配だよ
そういう話か。でもそれって、エミュレータ作れなかったらほんとにぶっつけ本番じゃないか。 SparcSolarisなら中古で数万円で買えるんだから買った方がいいって。 # 問題はAIXにHP-UXか……
gccとかのドキュメントに書いてあるのは「ネットに書いてある」に含まないのかね。
実績のある組み込み向けのCPUならともかく、
x86機上からPOWER, SPARC, Itaniumへの
クロスコンパイルの実績がそんなにあるとは思えない。
だから細かいバグが残っている可能性がある。
そういう状況で
>>767 >>769 >>772 のような質問をする状態の人が、
うまく仕事をこなせるとは到底思えない。
出来る人は既に取り掛かっていると思われ。
↓辺りのページにたどり着いて。
http://cooltools.sunsource.net/gcc/ 素直に開発サーバレンタルルームに出向いて開発すべき。
>>775 Qemuの0.91以降なら
PPCエミュレーションでAIXとUltra-SparkのSolaris動くよ
5000万ぐらいのやっすい仕事4人で引き受けてやったとき
モノこっちで準備するだけで月のリース料180マソもするから
Qemuで済ませたよ
コンパイル作業もたつくとあれなので
3GhzのCPUにホストマシンを64bitOS+8GBのメモリにすると
いいよ。できれば石2つQuadに16GB以上積んだほうがいい
783 :
デフォルトの名無しさん :2009/04/11(土) 18:40:06
なんかしらないけど入札して妨害すればおk?
次のバージョンでprintfで2進表示出来るようになるらしいよ。
>>785 GCCとprintf()に何の関係が?
787 :
デフォルトの名無しさん :2009/04/11(土) 21:08:06
gccってなんですか?
>>786 printfの引数の数、型の検証をする機能はあるから2進表示の知識も加わるんじゃない?
表示自体はlibcの仕事だろうが。
789 :
デフォルトの名無しさん :2009/04/11(土) 23:02:40
おおこんなスレがあったのか。 昔、留学中にインストレーションドキュメントを訳したのだが、 いまはすっかり便利になったのだなあ。
gccはいいかげん0bBBBBBBBB表記を正式に取り込んでほすぃ・・・
C++0x使えよ
>>792 お〜、それは便利。 まだまだgcc3でもコンパイルしなければならないから
当分使えないけど。
無視される区切り文字も欲しい所ではある 0b_0110_1111_0000_0001みたいなね
HDLやってる人間じゃないと必要性を感じないから 永遠に実装されまい。
796 :
デフォルトの名無しさん :2009/04/12(日) 23:03:36
アセンブラから来たおれは実装してほしかったけどな。
リッチーが最初から入れてくれれば良かったものを、と思う。
_ _ ( ゚∀゚ ) まったくだ し J | | | | し ⌒J
MinGW3.4.5にSTLport5.2.1をインストールしようとすると、 awkが見つからないとのエラーが出ます。 もちろんMsysにもパスは通してあります。 MinGW3.4.5にSTLport5.2.1をインストールできた方はどう やったらできましたか?
ビット列を16進数で諳んじられないマはお断りって事なんだろう 桁区切り機能はちょっと欲しいかな
802 :
デフォルトの名無しさん :2009/04/14(火) 01:11:06
x68のGCCには付いてたんだよなそれ、なつかしいな・・・。
>>801 いや8進かと。
古い人はテンキー入力が体に染み付いているので。
x68もx86もx64もみんなxは小文字だろう?
マシン名としてのX68kは大文字かと
807 :
デフォルトの名無しさん :2009/04/14(火) 14:53:03
彼女うざいからアイドルにはまることをきめた とにかくファンクラブはいりまくるぞ
808 :
taguti :2009/04/14(火) 15:36:07
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点 (x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。 ・公式:底辺x高さ÷2を使って計算してください。 お願いします!!
810 :
デフォルトの名無しさん :2009/04/14(火) 20:06:04
811 :
デフォルトの名無しさん :2009/04/14(火) 20:06:45
>>808 その程度も出来ないのかw
プログラミングの力じゃなくて高校生1〜2年程度の数学の力だろ。
その上マルチなのか。wwwwww
>>765 いまさらだけど、
gcc -ffunction-sections -fdata-sections ...
ld --gc-sections ...
で未使用関数・変数の分は削れるのかな?
>>812 平面の問題なら中学生じゃないかな。高校生でできなかったら恥ずかしすぎる。
できるできないじゃなくて、メンドクサイからIT奴隷にやらせようとしてんだよ馬鹿
たかが三角形の面積がメンドクサイとは……よほど脳味噌に不自由してるんだな
またそういうことを
Aという静的ライブラリをリンクしているBという実行ファイルから Cという動的ライブラリの関数をコールしてその中からAの関数をコールしようとすると コールできる関数とUndefined symbolになる関数ができるんですけどどうしてですか?
820 :
819 :2009/04/18(土) 12:15:33
試行錯誤してると、Cからコールする前にBで先にコールしておくと CでもUndefined symbolにならないようです 最適化関係のバグですかね… ちなみに、↓です gcc version 3.4.6 [FreeBSD] 20060305
Aの関数をどういう形でCから呼び出してるの? ポインタ渡してコールバックさせてるなら不具合っぽいけど、Bで呼び出しもポインタの取得もしていないならその関数をリンクしないのは最適化としては自然でしょ。
見つからなければ探しに行ってくれてもいいとは思うけど、 動的ライブラリも独立したプログラムだからこれが自然なのかな CにもAを静的リンクさせるとか無駄でやりたくないんですけど…
(静的リンク)+(ダイナミックリンク)じゃなくて (静的リンク|ダイナミックリンク)+(実行時ロード)での話なら ロード時にシンボルの解決範囲がオプション指定できるからそれかも?
RTLD_NOWを指定すると、ロード時にUndefined symbolになりますた A.a内にfunc() B.out内にmain() C.so内にhoge() という関数があって、B.outがA.aを静的にリンクしている状態で、 B.outがC.soを実行時ロードしてhoge()をコールして、 hoge()からfunc()をコールしようとしています
自前でアドレス解決しないとダメなんじゃないの?
いやそれはないだろ。 その設計は普通のモジュール構成だし。本体側が提供するAPIを 自由にコールできないなんて聞いたことない。なんだろ?
あ、gcc -rdynamic / ld --export-dynamic してみ?
>>826 本体側が(正しく)提供してないからだろう。
そのタイミングで名前をリンカが知っていることが保証されていないと。
>>827 gcc -Wl,--export-dynamic
という形ですけど、それは指定してるんですよ
>>820 で「Cからコールする前にBで先にコールしておくと」と
書きましたが、実際にはBでのコールは実行される必要はなく、B内で
使用しないダミーの関数を作って、その中に func() を書いておきさえすれば、
C.so内のhoge()からA.a内のfunc()をコールできます
830 :
sage :2009/04/18(土) 21:22:41
…と書いたあとに原因が分かりました A.aをリンクしたつもりでも、A.a内のfunc()はB.outにリンクされていませんでした これはコンパイラはfunc()の使用を知るすべがないので、やむを得ないですね
あ、わかった。 -Wl,--whole-archive libA.a -Wl,--no-whole-archive ... -ldl で指定した静的ライブラリのオブジェクトをオブジェクト中シンボルを 実行ファイル側で使っているかどうかに関わらず無条件取り込みできるよ。
832 :
819 :2009/04/18(土) 21:36:46
>>831 確認しました
B.outがでかくなりましたけど、コールできました
皆さんありがとうございました
既に解決しているようだけど…
>>819 には実行環境が書いてないけどld.soでしょ。
ld.soのマニュアルも読んでおいた方がいいかと。
GOTやPLTについて。
ちょいと質問なんですが、iccの-pc64に相当するオプションってgccにはないんでしょうか。 どうにも計算結果が微妙なんで調整してみたいんですが。
-ffloat-storeじゃなかったっけ?
>>835 情報THX。
色色試行錯誤した結果、今回は-f(no-)float-storeは関係なく、
-msse2 -mfpmath=sseでicc -pc64と(計算結果が)ほぼ一致しました。
うーん、やっぱりアセンブリ出力を比較しないとダメなんだろうか……
837 :
デフォルトの名無しさん :2009/04/23(木) 00:58:42
839=815=知能障害者
じゃぁまずは新しいアセンブラを・・・おっとその前に新しいCPUをだな
842 :
デフォルトの名無しさん :2009/04/24(金) 00:06:49
4.4.0って何が目玉なの?
そろそろ安心して使えるようになる。
4.4.0安定したが性能が2割遅くなった
C++0x の先取りが面白そうかな。
GCC4系も、MinGWが採用してくれない限り信頼して使えないんだけど。。。
>>844 >性能が2割遅くなった
コンパイル速度?
それとも産物の動作速度?
生成物の性能はちょっとあがったんじゃなかったかな。 もちろんiccには負ける、というブログ記事は見た。 でも、今回のリリースは自動並列化フレームワークの仕込みが目玉でしょう。 まだgcc -ipoできる日は来るのかな?
>>848 自動並列化は使い物にならないよおもちゃレベルでしかない
IntelのThredBuildingで並列化したほうが性能いいし
850 :
デフォルトの名無しさん :2009/04/25(土) 22:10:39
x86のインラインアセンブラを移植したいのですが intel構文から、AT&T構文の拡張インラインアセンブラ構文に 書き換えするサンプルが見つからなくて困っています。 .asmを.sに書き換えるサンプルはいくつか見つかったのですが・・・ Darwinのgccは-MASM=intelが使えない・・・orz。
>>850 しってるけど土曜日だから教えないw
うひひひ
MinGWのGCCって今バージョン何?
DJGPP は4系列なんだけどなぁ。 Windows だと難しいポイントとかあるのかね。 むしろ要求される品質レベルの方が違うのかな?
mingw は"2級市民"だから。公式には旧式のやつでいいってこと。 個人で4.3系列配ってるひとはいるにはいる
mingwはやる気ないだけだろ。 3系だって3.4.6にしないし。
公式でも 4.3.0 は testing として配ってるじゃん. 1年以上更新されてないけど、それは 3.4 も同じw
>>851 平日になりましたので回答を頂けると幸いです。
裏は必ずしも真でないわけで…
というか休日の間に調べとけと。 構文の説明なんぞいくらでも出てくるし、 あとはGCC x86の●ーリング●ンベンションをだな (ヒント:●には同じ文字が入る)
ボーリングボンベンション
カーリングカンベンション
ローリングロンベンション
ションベン・プロレスリング
> コーリングコンベンション の検索結果 約 2,530 件中 1 - 10 件目 (0.35 秒)
atom向け最適化はいつ入りますか?4.5?
AMDが出しているOpen X86コンパイラとかいう gccの改悪版あれすげー遅いな AMD何がしたいんだ?
CPUベンダとしてコンパイラくらいつくらにゃならんってことだろ
gcc 4.4.0がリリースされたというので、 ビルドしてインストール(usr/local/)してみたんですが、 アンインストールしたいのですが、 /usr/local/には他にgccは入れていないのですが、 /usr/local/にあるgcc4.4入れた時にできたディレクトリを削除すればOKですか? 他に削除するところはありますか?
ですが、 ですが、 ですが、
>>871 そうだよ。でも/usr/local配下のbin/ include/ info/ lib/ libexec/ man/ share/には全部関連するものが
入ってると思うよ。
874 :
デフォルトの名無しさん :2009/05/10(日) 18:41:18
gccについてというわけではないですが、詳しい人がいそうなのでここで質問します。 C言語の opaque の利用方法についてです。 -- hoge.c -- struct hoge{ int a; double b; } __hoge[] = { {1,2.0}, ... }; -------------- -- hoge.h -- typedef struct hoge hoge; extern struct hoge __hoge[]; ------------ としてやりたいのですが、 上の __hoge[] が error: array type has incomplete element type こんなことをいわれてしまい、うまくコンパイルできません。 シンボルさえ解決できれば問題なさそうなのですが、 うまく通す方法ご存知の方おしえていただけないでしょうか? バージョン gcc4.0.1 です。 よろしくおねがいします。
>>874 hogeの定義もヘッダに書け。
あとそれくらいCのスレで聞けばいい。
うーん、「opaque」なので定義をかいたら意味がないかと ..... Cのスレさがしたのですが、なかなか答えがきけそうなところが見つからなかったのでした。 ただ、スレ違いすぎる気がするので、別のところにクロスポストしてみます。
ああ、理解しました。通るわけないか .... ありがとうございました。
878 :
デフォルトの名無しさん :2009/05/10(日) 19:14:19
質問です。 Cygwin+GCCでどうしてもUTF-8を扱いたいので #include <stdio.h> #include <stdlib.h> #include <wchar.h> int main(void){ setlocale(LC_ALL, "Japanese_Japan.932"); wchar_t str[]=L"あいうえお"; wprintf("%lc", str[0]); return 0; } のようなコードを書きました。 ”あ”と言う文字を表示したいのですが、 wchar.hをインクルードしてるにもかかわらず、wprintfやsetlocaleが無いとコンパイラに言われます。 何をインクルードすればいいのでしょうか?ググってもwprintfに必要なヘッダはwchar.hとしかかかれてませんでした。 ちなみに、GCCのバージョンは3.4.4です。 よろしくお願いします。
配列というのは中身がわからないと作れない。 だから、そういうことはできない。 (配列はポインタではない)
解決してたorz
>>878 コンパイラが、ヘッダファイルがみつからないので読み込めなかったとか
エラー吐いてないかね?
でなければ wprintf をヘッダファイルが入ってるディレクトリで grep してみれ。
それでもダメなら、なんか #define が必要とかかなぁ。
>>879 ありがとございます。
>> 配列というのは中身がわからないと作れない。
自分の理解では、構造体の定義情報がないとサイズが計算できないためいくらがんばっても
(配列や1つのインスタンス)であっても計算できず IA32 or IA64 のような
アドレスポインタならばとりあえず参照くらいはできるはずだぜー
っとう感じなのかなと思います。
それはそうと、予約識別子しね。
>>878 #include <locale.h> も必要じゃね?
それからソースコード中のワイド文字列リテラルの文字コードを
どう解釈するかは処理系依存だったはず。
gcc の場合は -finput-charset オプションで指定できる。
出力する文字コードの指定は -fwide-exec-charset オプション。
やりたいことがよくわからんが、
「あ」という文字を UTF-8 で出力したいってことなのか?
>878 Cygwin 1.5 ならあきらめろ。wchar 系関数は無効にされてる。 Cygwin 1.7 では wchar 実装中だったからもう少し動くようになってるかもしれない。 >setlocale(LC_ALL, "Japanese_Japan.932"); これってどこかから引っ張ってきたコード? どうせ設定するなら "ja_JP.UTF-8" じゃないの? で、そもそも論だが UTF-8 使うのに wchar 系の関数が必要か? 入出力は UTF-8 で内部では wchar_t で持つつもりなの?
885 :
878 :2009/05/10(日) 20:23:26
なるほど・・・ Cygwin側の問題でしたか。 あ、localeに関してはlocale.hのインクルードで解決しました。 やりたい事は、1バイト単位ではなく、ユニコード単位で文字列操作を行って 結果を表示したいと言う事です。 なので、内部でcharで持ってしまうと都合が悪いのです。
>>884 それはおそらくVCの書き方。
だから、たぶんMinGWでいける。
当然、Cygwinでも-mno-cygwinなら使えるのだと思う。
>>885 それなら内部エンコーディングはUTF-32で保持する必要あるんじゃないの。
>>885 Unicode だったら UTF-8 以外でもいいのか?
シーケンシャルな操作しかしないなら UTF-8 は扱いやすい符号だけど…。
「やりたいこと」ってのが
>>878 から何も具体的になってない。
説明不足。
質問の意図がwprintf()を使うにはどうすれば? って話なんだから十分だろ。何使おうがどう処理しようが知ったこっちゃねぇ んで、その答えは -mno-cygwinを付ける。 ただしGCC-4は対応してません。
GCCでwchar_tは激しく欠陥品だから使わない方がいいぞ。 例えば #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <locale.h> int main(void){ char str[]="あいうえお"; wchar_t w_str[512]; setlocale(LC_ALL,"ja"); int len=mbstowcs(w_str,str,512); wprintf(L"%s", &w_str[2]); return 0; } このコードは普通なら、3番目の文字から表示する事を期待するが 実際には、 いうえお と表示される。これでは何の為にワイド文字に変換したのかw 同じコードは、VC++だと正常に表示される。 悪い事は言わん。お前の知識だとハマるだけだから、素直に回避しとけ。
所詮毛唐の使う7bitコードさえちゃんと動けばいいって事か ソ系ダメ文字も相変わらずだし
ダメ文字()笑 それはオプション正しく設定してないだけだろ
>>890 cygwinのライブラリがウンコなだけでgccのせいじゃない
今のCygwinのwcharなんて使おうと思うほうが間違い。 MLにfujiedaさんがCygwinのI18Nに手をつけるとか投げていたけど、 なしのつぶてだな…
もう飽きたんでしょう。
>>892 MinGW3.4.5のインストーラで入れた版はダメでした
手で一つ古いcc1.exeとcc1plus.exeを入れたらうまく行きました
ありがとうございました
公式の Mingw 3.4.5 バイナリって iconv リンクしてなくね?
>>898 いや、俺はもう解決してるんだけど、
公式なものでなんでこんなことになってんのかな…と
所詮8ビット圏の連中は軽視されていると思われる
軽視というか、こっちから 声出したり手出さないといけないんだろうな。 と思いつつ何もしていないけど。すまん。
ヨーロッパの大半も8bit圏なんだが。
もう GCC は巨大すぎだ 経緯とか理屈とかさっぱりわからんし、 英語の文書を追う気にもならん。
C++の場合は、gccにlibstdc++が入っているけど、 Cの場合は、gccにはlibcが入ってなくて、 libcの実装はプラットフォーム毎に違うから、 gccの問題じゃないよ。スレ違い。 char str[]="あいうえお"; このmbcs部分のエンコードがおかしいってのなら gccの問題に他ならないんだけど。
x86でのlong longの演算がどうコンパイルされているのか理解しようとしてるのですが この部分が解りません。 %ebxにはある8バイト整数の上位4バイトが入っているところで sar $0x1f,%ebx sar $0x1f,%ebx と、右に31ビットシフトを二回やってます。 SARの定義によると、%ebxが もし負であったら結果は%ebxが 0xffffffffになって31ビット目がキャリーに。 正であったら0x00000000になってやはり31ビット目がキャリーに。 これの意図もまだ解らないのですが、2番目のSARにどういう意味があるのか全く 検討が着きません。始まる段階で%ebxはすでに2つの値でしかあり得ないのに なぜまた31ビットもシフトしてるのでしょうか?
キャリー←正負
907 :
905 :2009/05/16(土) 11:18:02
>>906 正負判定をキャリーに入れる為の2つのSARであると?
sar $0x20, %ebx ではだめなのでしょうか?
%ebx←0xffffffffあるいは0x00000000
$0x20=0?
Cのコードを提示しなきゃわからない
>>907 なんでマニュアル見ないの?
The 8086 does not mask the shift count. However, all other IA-32 processors
(starting with the Intel 286 processor) do mask the shift count to 5 bits, resulting in
a maximum count of 31. This masking is done in all operating modes (including the
virtual-8086 mode) to reduce the maximum execution time of the instructions.
最早、スレ違いだがな。
これについて教えてください。
>
http://www.issei.org/diary/_20030224/d200212c.html#21-2 全般的に飲み込めないのですが、特に3で「もし出力後に入力オペ
ランドから読み込む必要があるなら」という箇所があります。
おそらく asm (" " : "=r" (offset) : "0" (offset)); というようなケース
を差しているのだと思うのですが・・・
これは、アセンブラのなかで閉じたループをするなどして、
入力オペランドを書き換え、次のループで再度読み込んでいるケース
などを差しているのでしょうか?
それとも、アセンブラの外で書き換えされるケースについても考慮が
必要となるのでしょうか?
まずレジスタ割付でググって。 int out; int in = 1; asm("mov 0,%0; mov %1,%0" : "=r"(out) : "r"(in)); この例文でそうなることはまずありえないけど、レジスタ割付最適化の結果 %0と%1に同一のレジスタv0が割り付けられ mov 0,v0 mov v0,v0 outの中身が0になるかもしれないよってこと。 "=&r"(out) : "r"(in)なら入力と出力を確実に違うレジスタに振り分けてくれるっていう話。
難しく考えることないと思うんだけどな。 (特に指定がなければ)出力は入力とエイリアスしてるかもしれないから、 出力に書き込んだら入力は読むな、ということで、 ある程度長いコードをインライン化する時に、そうしたいことってたまにあると思うけど。
916 :
913 :2009/05/21(木) 19:28:52
>>914-915 ありがとうございます。
最適化で入出力のレジスタが共用されてしまい、意図したように動かない
ことがあると理解しました。
となると、回避するには書き込み側を"+m"にするなどで逃げるのが
安直な回避策となりますか。
gcc はインラインアセンブラも最適化の対象になるので、 レジスタ割り付けがどうこう以前に 書いた命令自体もそのまま残るとは限らない。 ちゃんと書こうと思うと結構難しいよなぁ。 (volatile で逃げることは出来るけど… 何か負けた気がする)
intel構文のインラインアセンブラをgccに移植しようとしています。 //const int64_t qword_4354h = 0x4354435443544354LL; #define qword_4354h "$0x4354435443544354" // movq mm2,qword_4354h " movq "qword_4354h", %%mm2 ¥n¥t" こんな感じで書き換えているのですが、 suffix or operands invalid for `movq' と怒られます。どのように直せばいいのか調べているのですが、どうしても 見つかりません。アドバイスをいただけませんでしょうか。
>>918 そもそもmovqのオペランドには即値($...)は使えないのでは?
とりあえず、こんな感じならちゃんと動くと思う。俺の環境に合わせて書いてみた。テストしてないけど。 ソース例 void test() { const long long int qword_4354h = 0x4354435443544354LL; // int64_tでもよし asm ( "movq (%0), %%mm2 " : : "r" (&qword_4354h) ); } コンパイル結果 (gcc version 3.4.5) バージョン古いけど勘弁 __Z4testv: pushl %ebp movl %esp, %ebp leal -8(%ebp), %eax subl $8, %esp movl $1129595732, -8(%ebp) movl $1129595732, -4(%ebp) /APP movq (%eax), %mm2 /NO_APP leave ret
>919-920 ありがとうございます。即値は使えないのですね。 920さんの方法でもOKでしたが、 グローバル変数にしてしまうと変数名自体をソースに直接 埋め込めるみたいです。 それにしても、移植作業では、gcc側でダブルクオートを使うせいで いろいろマクロの置き換えをしないとならず、かなり面倒ですね・・・。
-O2 -gでコンパイル後stripと -O2 stripの場合は 最適化度は等価ですよね?
stripは最適化するものでは無いが
・・・え?
なにそれこわい
出力のサイズが小さくなるならなんでも最適化ってことか?
もともとコンパイラの世界では「最適化」が「向上」くらいの意味だしな。
gccは-gオプションをつけても最適化される
-sとか-gとか最適化に関係無いですから…
>>929 そうなの?
昔は-gつけると最適化されないからデバッグ時は要注意なとか
言われてた気がするがそんなことは実はなかったのか
>>931 GCCは最適化をしてもデバッグが出来る。
GCC allows you to use -g with -O.
(snip)
Nevertheless it proves possible to debug optimized output. This makes
it reasonable to use the optimizer for programs that might have bugs.
最適化っていう言葉はコードの最適化という意味だけではないからな。 サイズの最適化、UIの最適化等々 最適化という単語だけで話しても意味ないよ
>>933 > UIの最適化等々
このスレでこれは無い
GCCのコマンドラインインタフェースについてならあるいは
dehydra/treedydraが使っているpluginフックが4.5にmergeされた。 lint系のツールが増えて、恒常的にメインテナンスされるかも。
ここではlintの言葉で喋れ・・・
gccっていつまで64bitよりも 32bitの方が高速なの修正されないの?
939 :
デフォルトの名無しさん :2009/06/19(金) 19:21:11
x86の場合64bit化自体性能差ほとんどなくて むしろ大メモリアドレスを扱えるようになるほうがメイン
>>939 嘘乙
x86とx86_64の違いを考えてみろよ
AMD64は明らかに性能差が出てるだろうが
long long を多用するコードなら差が出るだろうけどさ。
>>941 馬鹿過ぎて話にならん
アーキテクチャの違いを勉強してこい
まさか、レジスタが増えてること知らないのか?
>>939 は、まったく逆だよ。
「x86以外では」アドレス空間の増加が主な利点。
結局どうなるの? 速くなる遅くなるってのはgcc限定の話?
CPUにもよるんじゃないの? たしかCore2系は64ビットのデコードが早くないとか。
トンクス。まぁ、一般人レベルならあんまり気にする必要はなさそうだな。
インテル様が64bitでも増えたレジスタ使うなって言ってた
増加したレジスタ使うと不可解なバグ 出るから利用はやめたほうがいい
>>949 それはインラインアセンブラやってる人に言ってるのか?
それとも、コンパイラ開発者に言ってるのか?
>>951 いやicc以外バグがあるってintelに指摘されてるでしょ
こういう嘘つき野郎って、やっぱり頭おかしいんだろうな
GCC以前に64bitの演算器が32bit未満の並列粒度しか保障してない CPUもなかったっけ?
世の中にないと断言するのは難しいが。
プレスコは32bit演算器のパイプ2段で64bit命令実行している。 CoreMAは最初のころ命令デコーダがEM64Tの命令切りわけ時に ペナルティがあった。 レジスタが増えた分と実行性能が落ちる分とがあるから、 64bitにしたら単純に性能が上がるとは言えない。
一般論で言えるわけではなく、そのCPUの出来が悪いってだけの話だな。
Athlon64は初期のころから性能上がるケースが多かったけど、 Intel は Core2 でもあまり性能上がらなかったからな。 ネハーレンでやっと最初から64bitをターゲットに設計したCPUになった。
そもそも、一般論で終わらない話題だろーが。 上のほうで「速くなる」とか「遅くなる」とか言ってるのがアホってだけで。 んなもん、CPUと対象のプログラムに依存するにきまってんだろ。
iccもvcもpgも速くなるのに なぜかgccだけは64bitでもっさりするw 終わってるよな
vcは全然はやくなんねーけどな。
レジスタいるような計算ぶん回してるときって、 push/popが実質0クロックで終わるから、レジスタ増えたこと自体は 大した解決にならないんでないの。 push reg/pop regも1バイト命令だし、ALUがボトルネックになるだろうから 今時のx86デコーダの負荷にはならんだろうし。 レジスタリネーミングが無いプロセッサとか、 レジスタ割り当て問題にコンパイラが悩まされてるときなら レジスタが多いのは役に立ったけど、今となっちゃあ それだけでパフォーマンスアップしろってのは難しいでしょ。
スタックフレーム上のローカル変数(レジスタ割付できなかったもの)は 普通、push/popなんてしません。 毎回直接読み書きするし、 それがアドレスを示すものならば、必ずレジスタにロードしてから(アドレス先に)アクセスします。
>>963 の内容は
「レジスタ変数に割り当て可能なレジスタ」が増えた場合の話だけね。
局所的な計算に用いる「レジスタの増加」とはあまり関係ない。
そういえば、レジスタが足りなくてpush/popするのは人間だけか。 でもやっぱりmovも0クロックじゃね? ほとんどのケースで演算に隠れちゃいそうだけど。
たとえキャッシュに乗っていたとしても、 メモリの読み書きとレジスタじゃ速度が違うんだよ。 そうでなければレジスタの存在意義が半減する。 だからこそRISCとかは沢山のレジスタを持ってるし x86だってレジスタリネーミングとかを駆使して補おうとしている。 補えないから、一時変数としてのメモリの読み書きが発生してるんだがね。
>>967 いや、だから今時のx64積んでるようなx86ってその「レジスタの存在意義が半減」してるから、
単にレジスタ増えただけじゃあんまり変らなくね?って話ですよ。
キャッシュアクセスのスループットがいくら悪くても、
前後の演算なりイテレーションなりに隠せないようなケースってのは
ほぼ無いと見ていいんじゃないかと。
もちろん、裏付けがあるわけではないので、
「んなわけねーよ、メモリ待ちでストールしまくりだよ」
と言われるとそれまでです。
>ほぼ無いと見ていいんじゃないかと。 これだけは絶対ありません。 そして、(対32bitにおけるデコーダ等の不利の無い場合) 64bitで再コンパイルしたコードの速度が実際に速くなっているという事実が 全てを物語っていますけど。
頼むからレジスタなんて多くても速くならないなんてスーパー馬鹿は放置してくれ
あちこちで同じような馬鹿が沸いてるな
レジスタの多かった下手なRISCよりもx86の方が早かったのも事実だが、 開発費を湯水のように使って高速なプロセッサの設計が出来、 開発費の回収も出来たからだろうな。 現状はレジスタ数を増やした方が早くなっているものの、早くなっていないアプリもある。 演算やポインタの単位が64ビットになって、キャッシュに対する影響が出ているのではないかと 思われるが、本当の理由についての解析は完璧に進んでいるのかな? 32bitでレジスタ増えるモードがあれば、相当に高速であるだろうとは思うが そんな命令セットになってないし…
テンプレートを使ったコードのコンパイルエラーがもっと見やすくならない ものか。あれでSTLを使うのに恐れをなす初学者は多いだろうな。
conceptが完成の暁には〜
978 :
977 :2009/06/24(水) 18:38:43
>>976 一時期使ってたことあったのだが、何でやめたのか思い出せない。
また使ってみるか。
ActivePerlを入れるのが面倒なのとコマンドラインでしか 使えないので使い勝手が悪かったので俺はやめた
redhat linux 8.0 で自分のディレクトリにgccインストールしようとしたら make[2]: *** [configure-stage1-target-libgcc] エラー 1 make[2]: 出ます ディレクトリ `/***/src/gcc-4.3.3' make[1]: *** [stage1-bubble] エラー 2 make[1]: 出ます ディレクトリ `/***/src/gcc-4.3.3' make: *** [all] エラー 2 てな エラーが出るんだが、これってどう意味? ググったけどあんまり参考にならなかった。
もうちょっと上のほうのメッセージがないとなんとも もうちょっと上のほうで xgcc だかなんだかがエラーはく → それを起動してた make がエラーになる → その make を起動してた make がエラーになる って感じになってて、そのメッセージじゃその最後の2つだけしかわからないから、根本的な原因がわからない
make cleanして もう一回makeしたらこういうのが出ました。 checking for suffix of object files... configure: error: cannot compute suffix of object files: cannot compile
disk fullなんじゃねーの?
使っているgccが古すぎて新しいgccが正しく作れない。 なんて事もあったりする。 RH8じゃ元々入ってるのはかなり古くないかい?
>>984 diskはフルじゃないこと確認した。
>>985 調べてみたけどgcc バージョン 3.2だ。2002年だけど、これってかなり古い部類?
gmp,mpfrがらみ?
>>987 それは両方とも最新のをインストールしてあります。
上のエラーでググるとインストール先が変でxgccが起動してないってのがあった。
>>986 gcc-3.4.6でgcc-4.1.1のクロスコンパイラ作ろうとしたら、
libgcc作る所でxgccがInternal Error吐いたことがあった。
gcc-4.3.3にしたら問題なし。
configureの段階でバイナリ吐けないってlibcのヘッダが入ってないとかでないの?
992 :
981 :2009/06/26(金) 16:39:35
config.logから関係ありそうな部分抜き出してみた。 configure:3251: checking whether the C compiler works configure:3257: ./a.out configure:3260: $? = 0 configure:3277: result: yes configure:3284: checking whether we are cross compiling configure:3286: result: no configure:3630: gcc -c -g -O2 conftest.c >&5 conftest.c:2: parse error before "me" configure: failed program was: | /* confdefs.h. */ | | #define PACKAGE_NAME "" | #define PACKAGE_TARNAME "" | #define PACKAGE_VERSION "" | #define PACKAGE_STRING "" | #define PACKAGE_BUGREPORT "" | /* end confdefs.h. */ | | int | main () | { | exit (42); | ; | return 0; | }
それはstage1のtarget-libgccのconfig.logなの?
いや、makeする前のconfigureのログだと思う。
>>983 のエラーの後にfor more detail see cofig.logとか何とか書いてあったので見てみたわけです。
stage1-gcc/cc1 --help とかやって、コンパイラ本体が動くか確認してみては?
996 :
981 :2009/06/26(金) 23:30:37
>>995 すまん、それはそのまま
% stage1-gcc/cc1 --help
って打ち込めって事で合ってる?
もうだめかも分からんね
エラーをエラーと見抜けないと(gccを使うのは)難しい
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。