トップページ⇒tech
1001コメント281KB

GCCについて part8

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/10/13(土) 00:07:39
史上最強かもしれないツール、GCC(GNU Compiler Collection)について語るスレ。

GNU本家のGCCページ
http://gcc.gnu.org/

Binutils - Collection of binary utilities ←これも必要だぞ。
http://www.gnu.org/directory/GNU/binutils.html

GNU Binutils
http://sources.redhat.com/binutils/

GCC online documentation
http://gcc.gnu.org/onlinedocs/

Installing GCC
http://gcc.gnu.org/install/

GCC Timeline
http://gcc.gnu.org/releases.html#timeline

Calendar
http://gcc.gnu.org/develop.html#timeline

前スレ
GCCについて part7
http://pc11.2ch.net/test/read.cgi/tech/1145357824/l50
0357デフォルトの名無しさん2008/04/08(火) 13:17:09
libfoo1.a内のどのオブジェクトがlibfoo2.a内のどのオブジェクトに依
存しているかなど、もうちょっと詳しい情報が欲しいけど、とりあえず
gcc .... -lfoo1 -lfoo2 -lfoo1
のような感じでできへん?

libfoo1.aとlibfoo2.aをバラして1つのlibfoo.aにしてしまうとかも。

0358デフォルトの名無しさん2008/04/08(火) 13:44:25
>>356
http://sourceware.org/binutils/docs/ld/Options.html#index-groups-of-archives-127
0359デフォルトの名無しさん2008/04/09(水) 13:51:18
LIBRARY_PATHとLD_LIBRARY_PATHの違いは何ですか?
0360デフォルトの名無しさん2008/04/09(水) 13:53:28
ldかld.soか
要するにコンパイル(リンク)時か、実行時か。
0361デフォルトの名無しさん2008/04/09(水) 16:39:29
>>352
どうやってやるの?
IとかLとかでいちいち指定するの?
それともmake?小さいプログラムではわざわざmakeなど使いたくないのだが。
0362デフォルトの名無しさん2008/04/09(水) 16:41:32
スクリプトでやればいいじゃん
0363デフォルトの名無しさん2008/04/09(水) 17:14:24
>>361
CFLAGS=-I/usr/include/foo
LDFLAGS=-L/usr/include/foo -lfoo

default: foo

これだけ。foo.cから実行ファイルfooを作る。
0364デフォルトの名無しさん2008/04/10(木) 10:28:43
/usr/lib/gcc/target/version/includeのようなgcc付属のヘッダのある
ディレクトリを取得する方法はありますか?
-nostdincを指定してるソースからstdarg.h等を使いたいのです。
0365デフォルトの名無しさん2008/04/10(木) 11:13:22
gcc -print-search-dirs
0366デフォルトの名無しさん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 で終了しました
0367デフォルトの名無しさん2008/04/10(木) 16:19:41
? gcc -v -g -O0 main.c -o huga -L. -lhoge
0368デフォルトの名無しさん2008/04/10(木) 17:02:27
? gcc -v -g -O0 main.c -o huga -L. -lhoge -Wl,--verbose
0369デフォルトの名無しさん2008/04/10(木) 17:43:36
CとFORTRANでは最適化の方法が違うの?
0370デフォルトの名無しさん2008/04/10(木) 22:06:32
>>366
t ってことはローカルシンボルじゃん
0371デフォルトの名無しさん2008/04/14(月) 20:54:13
Cygwin上でGCCのC,C++のクロス環境を作ってます。
newlibと組み合わせてビルドはうまくいってるんですが、
libstdc++のgchファイルがかなりサイズを食っていて扱いづらいです。
実際には、C++の言語本体の機能だけ利用できれば十分です。
configure時にうまく無効にする方法などあれば教えてください。
0372デフォルトの名無しさん2008/04/15(火) 13:19:53
libstdc++で
configure --help
やってみたら、何か出るかも?
0373デフォルトの名無しさん2008/04/15(火) 13:22:43
GCCに、関数呼び出しとリターンを表示させたり記録させたりする
オプションってありましたっけ?
なんかあったような気もするけど、ぐぐってもヒットせんかった。
0374デフォルトの名無しさん2008/04/15(火) 13:25:40
実行時だとみれるような機能があったような?
0375デフォルトの名無しさん2008/04/15(火) 13:35:46
>>373
記録させることはできないが、-finstrument-functions で hook させることはできる。

ググればいろいろ出てくるが、
http://www.ibm.com/developerworks/jp/linux/library/l-graphvis/index.html
ここがわかりやすいな。
0376デフォルトの名無しさん2008/04/15(火) 13:56:20
>>375
なにこれー!今日ほど2chが役に立った日はないわ。ちょーさんくすこ。
0377デフォルトの名無しさん2008/04/15(火) 14:23:08
>>371
--enable-libstdcxx-pch build pre-compiled libstdc++ headers
[default=$is_hosted]
03783712008/04/15(火) 21:11:44
>>372,377
ありがとうございます。
--disable-libstdcxx-pchを入れて試してみます。
0379デフォルトの名無しさん2008/04/24(木) 20:53:48
gccで、クロージャとは言わないまでも、
ユーザーが作った関数へ、後から動的に値を埋め込む方法はありませんか?
言語処理系のコールバックの実装で、
その関数が呼び出された時に、その値を参照したいのです。
グローバル変数や、アセンブラを使えば作れるのですが、
できれば使わずに済ませたいので。
0380デフォルトの名無しさん2008/04/24(木) 21:00:19
任意のパラメータを受け取れる void* 型の引数を作るといいよ。
0381デフォルトの名無しさん2008/04/24(木) 21:00:26
つ 関数へのポインタ
0382デフォルトの名無しさん2008/04/24(木) 21:28:31
#include </dev/tty>
0383デフォルトの名無しさん2008/04/24(木) 21:30:04
>>380-381
いやそうじゃなくて。
言い方を変えれば、関数とユーザー値を組み合わせて
新しい関数を作れるかって事です。
その新しい関数は、呼び出し時に
なんらかの方法でユーザー値を受け取れる事。
0384デフォルトの名無しさん2008/04/24(木) 21:31:21
また、誰が呼び出すかは判らないので、
ユーザー値をその関数の引数に入れる事はできません。
0385デフォルトの名無しさん2008/04/24(木) 21:39:56
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はその型に合った関数型になる)
0386デフォルトの名無しさん2008/04/24(木) 21:55:20
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)));
}
0387デフォルトの名無しさん2008/04/24(木) 22:02:29
>>386
C++の型拡張による物は呼び出し側(f相当)を限定してしまうので不可です。
あくまで汎用的なコールバックに使える事が前提なので。
一応nested functionで限定的にできる事は判っています。
0388デフォルトの名無しさん2008/04/24(木) 22:08:04
>>387
その限定というのは、boost::function (もしくはstd::tr1::function)で何とかなるものではない?
0389デフォルトの名無しさん2008/04/24(木) 22:16:17
>>388
boost::functionでできそうです。
ありがとうございます。
0390デフォルトの名無しさん2008/04/25(金) 13:47:24
GCC4で、できなくなった気もするが
つ ttp://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Nested-Functions.html
0391デフォルトの名無しさん2008/05/03(土) 12:17:28
Apache C++ Standard Library 4.2.1 released
http://mail-archives.apache.org/mod_mbox/www-announce/200805.mbox/%[email protected]%3e
0392デフォルトの名無しさん2008/05/20(火) 07:48:27
ttp://gcc.gnu.org/ml/gcc/2008-05/msg00216.html
> GCC 4.2.4 is now available to download from gcc.gnu.org and ftp.gnu.org
0393デフォルトの名無しさん2008/05/24(土) 14:54:03
たまに聞く、GCCは4シリーズより3.4とかの方がアプリなどの動きが早いって聞いて入れてみた。
コンパイルが出来ない物が出てきたから一時は諦めたけど、最近C++関連は(sijc,glibmm,cairomm,gtkmmなど)
全部同じコンパイラーじゃないとうまく動かないというのを知ってその辺全部3.4でコンパイル。

使用してみた感じ、コンパイル(-O2のみ)した各アプリの動きが良い。カーネル2.6.25もGCC3.4でコンパイル。
立ち上がりとかも早くなりました。dmesgの左に出る起動時の細かい時間とかも早くなっているのが解る。

GCCの4シリーズなどは、その新機能を生かすソースを書いてあげないとあまり意味が無いんでしょうか・・・
快適なのでとりあえずしばらく3.4メインにしようかな。
0394デフォルトの名無しさん2008/05/24(土) 16:53:22
>>393
気のせいですよ。
0395デフォルトの名無しさん2008/05/24(土) 17:50:22
このスレ見ている人がいるなんてwww 全米も感動(TT)
0396デフォルトの名無しさん2008/05/24(土) 18:26:30
違いが気になるなら、アセンブリ出力を見比べてみればいい。
0397デフォルトの名無しさん2008/05/24(土) 21:59:58
アセンブリなんか見るよりアプリケーションベンチ取ればいい。
アセンブリの差はCPU側の処理方法によって優劣付けにくいから。

それにしてもgcc替えてまでやっての感想が「気がします」とは
だんだんオーヲタみたいになってきたな。電源ケーブルを純銅にしたら
電気の流れが速くなってキビキビ動作になりました!と変わらん。
0398デフォルトの名無しさん2008/05/24(土) 22:49:16
>>393
気になるなら調べてください。
調べる気がないなら気にしない方がいいです。
0399デフォルトの名無しさん2008/05/24(土) 23:14:13
>>393
自前コンパイルなら機種依存オプションまで付けろ、と。
0400デフォルトの名無しさん2008/05/24(土) 23:30:40
>>397
電源ケーブルは材質よりインピーダンスとアース極性チェックが大事。
信号線の方は俺は純銀ケーブルにしてる。無酸素銅とどっちが良いかはなんとも言えんが。
0401デフォルトの名無しさん2008/05/24(土) 23:38:43
>>400
うん。そういう風にわかってこだわるのはいいんだ。
>>393は試したって-O2だけかよ、って小一時間問い詰めたい。

実際のところ、カーネルとかマルチメディア系とかはコンパイラの癖にまで
依存したギリギリのチューニングが施されている場合があるから、
コンパイラの能力を評価するにはフェアじゃない。
0402デフォルトの名無しさん2008/05/25(日) 12:02:12
http://x264dev.multimedia.cx/?p=32
0403デフォルトの名無しさん2008/05/28(水) 22:45:06
そういや昔見たのは、
http://groups.google.com/group/comp.lang.forth/browse_frm/thread/545177ea53944038/eebaa14010b86c61?hl=en#eebaa14010b86c61
gccは2.95が最速、あとは遅くなるだけだぜ、みたいな話
0404デフォルトの名無しさん2008/06/01(日) 03:00:30
毎回gdb立ち上げて特定のメソッドにブレーク張ってとかの作業を
自動化してくれる方法はないでしょうか?
0405デフォルトの名無しさん2008/06/01(日) 03:07:00
>>404
gdbの起動時にスクリプトを実行する機能があるよ。
詳細はmanでも読んで。
04064042008/06/01(日) 03:14:36
>>405さんありがとうございます。
.gdbinitというファイルをカレントディレクトリに用意して
以下のように書いてうまくいきました。

exec-file ./test.exe
symbol-file ./test.exe
r
b main
0407デフォルトの名無しさん2008/06/02(月) 02:34:00
gccでコンパイルするときに
コンパイルしたソースファイルの名前を、
ディレクトリも含んだ状態でオブジェクトファイルに格納する
らしいのですが、
どこに書かれているのでしょうか?
0408デフォルトの名無しさん2008/06/02(月) 07:35:54
$ nm -a foo.o
0409デフォルトの名無しさん2008/06/07(土) 02:34:16
June 6, 2008
GCC 4.3.1 has been released.
0410デフォルトの名無しさん2008/06/09(月) 14:32:10
GCCで音階のプログラムを組もうとおもっています。
波数とパルスの詳細が知りたいので、教えてください。
4オクターブを想定しています。
0411デフォルトの名無しさん2008/06/09(月) 14:47:42
>>410
GCC関係あるのか?

どういうプラットフォームで何からどうやって音を出そうというのかを
はっきりさせて下のスレあたりで聞いたほうがいいように思う。

サウンドプログラミング4
http://pc11.2ch.net/test/read.cgi/tech/1185340076/
0412デフォルトの名無しさん2008/06/11(水) 12:28:28
GCCでプリコンパイル済みヘッダ使うとき、元のヘッダ*.hと同じディレクトリに
*.h.gchが作られますけど、release用とdebug用の二つのプリコンパイル済みヘッダを
使いわけたいときなんかは、皆さんどのようにしてますか?
0413デフォルトの名無しさん2008/06/11(水) 15:48:52
*.h 自体を release や debug 用ディレクトリに
コピーしてから使ってるなぁ。
0414デフォルトの名無しさん2008/06/11(水) 15:58:59
ディレクトリ指定してそこに作らせる。
0415デフォルトの名無しさん2008/06/11(水) 16:02:27
http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
によると、*.h.gch というディレクトリを作って、その中にそれぞれ用のプリコンパイルヘッダを置いておくといいらしい・・・
04164122008/06/11(水) 22:22:02
>>415 さんのやり方で無事できました。皆さんありがとうございます。
*.h.gchディレクトリ以下で、コンパイルオプションが同じものを勝手に使ってくれるようです。
プリコンパイル済みヘッダのファイル名はなんでもいいようです。
0417デフォルトの名無しさん2008/06/14(土) 17:28:44
長い間VC6、VC8(MFC)で実装をやってました
この度、新しいプロジェクトでlinuxでC++の実装を担当することになったのですが
VisualStudioの生ぬるい環境に、長い間どっぷり浸っていたせいで
いまいち、調子がよくありません
gcc(g++)の環境で、VisualStudioのようなデバッガーって無いのでしょうか?
0418デフォルトの名無しさん2008/06/14(土) 18:14:02
EclipseもC++に対応してたような
0419デフォルトの名無しさん2008/06/14(土) 19:47:48
>>418
Thx
Eclipseをインストールして、続けてC++の開発環境もインストールしました
実装に専念できそうです
0420デフォルトの名無しさん2008/06/14(土) 22:03:30
Eclipse既にインスコしたようだが、Dev-c++もお奨め
0421デフォルトの名無しさん2008/06/15(日) 00:25:52
eclipse/cdtかkdevelopだな
0422デフォルトの名無しさん2008/06/15(日) 00:46:17
Emacs以上の環境は存在しない
0423デフォルトの名無しさん2008/06/15(日) 01:29:33
これがゆとり世代か・・・
0424デフォルトの名無しさん2008/06/15(日) 03:30:54
emacsはもう死んだよ
0425デフォルトの名無しさん2008/06/15(日) 09:16:05
Emacs is dead. The future is notepad.
0426デフォルトの名無しさん2008/06/15(日) 13:48:10
>>424
ん?xyzzy が便利なんですが。CL だし。
0427デフォルトの名無しさん2008/06/15(日) 13:50:55
emacs憶えたら便利なんだろうって何となく思うけど、
憶えるための最初の一歩を踏み出す気が起きない。
0428デフォルトの名無しさん2008/06/15(日) 14:49:38
以下のような関数をgccでビルドするとき、
最適化オプションを何もつけていないのに
return -1;の部分が最適化されて消えてしまうことってありますか?

int func(void) {
// この関数が呼ばれた時点でバグなのでデバッグ時は無条件にアサートさせる。
assert(false);

// リリース時に万が一呼ばれたときはエラー値を戻す。
return -1;

}
0429デフォルトの名無しさん2008/06/15(日) 14:51:50
gcc -S でソース嫁
0430デフォルトの名無しさん2008/06/15(日) 15:07:12
>>428
gccは最適化ナシでも簡単なフロー解析(この場合、あからさまに到達不能なブロック)はやっている。

assert() 内部では __attribute__((noreturn)) なファンクションが呼ばれている。

あとはわかるな?
04314282008/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;

}
0432デフォルトの名無しさん2008/06/18(水) 01:00:22
複数の-g系オプションを並べた場合は
後ろの方が強いのですか?

gcc -ggdb -gxxx
0433デフォルトの名無しさん2008/06/18(水) 22:12:53
gcc 4.3,ひどいな…
0434デフォルトの名無しさん2008/06/18(水) 23:56:53
いつものごとく4.5くらいまで進めば安定するんでないかい。

ということで3.4使いつづけとります。

0435デフォルトの名無しさん2008/06/19(木) 00:39:25
俺にとって、4.3はC++0xのためだけに存在しているようなもの。
0436デフォルトの名無しさん2008/06/19(木) 02:02:01
openmpのこともたまには思い出して上げてください
0437デフォルトの名無しさん2008/06/19(木) 02:09:27
>>436
思い出してもageません?
0438デフォルトの名無しさん2008/06/19(木) 13:22:48
Converting GCC to C++
http://lwn.net/Articles/286539/
0439デフォルトの名無しさん2008/06/19(木) 20:38:48
>>438
これはつまり
gcc cxx.cpp
ができるようにするからくりというわけ?
0440デフォルトの名無しさん2008/06/19(木) 21:36:18
GCC を C++ に移植したいらしい。
0441デフォルトの名無しさん2008/06/19(木) 21:51:26
The FSF is not writing the code. にワロタ
0442デフォルトの名無しさん2008/06/19(木) 22:14:20
>>440
そっか逆か。ありがと。
0443デフォルトの名無しさん2008/06/19(木) 23:08:06
もういっそJavaでもいいんじゃね派が登場して
混沌としてほしい
0444デフォルトの名無しさん2008/06/20(金) 08:48:26
なんてアグレッシブな!と思ったけどブランチ作っただけでコードはまだか。
内部のモジュール化が進むといいなあ。
0445デフォルトの名無しさん2008/06/25(水) 01:07:28
JavaでいいならCOINS
0446デフォルトの名無しさん2008/06/29(日) 23:26:34
GCC 3.4 x86_64 で -mno-sse が効かないんですが、理由が分かる人はいますか?

gcc -S -fverbose-asm の出力を見ると、-mno-sse を付けているにも関わらず -msse が有効になっています
実際、アセンブリを見ても SSE 系の命令が出力されています
0447デフォルトの名無しさん2008/06/30(月) 01:01:06
>>446
-mfpmath=387
0448デフォルトの名無しさん2008/06/30(月) 01:56:55
>>447
それを付けても駄目みたいです
また GCC 4 系ではそれを付けなくても -mno-sse が有効になります
0449デフォルトの名無しさん2008/06/30(月) 02:01:23
>>446
>GCC 3.4 x86_64 で -mno-sse が効かないんですが、理由が分かる人はいますか?

横な質問なんですけどx86_64でSSEの無いCPUって何ですか?
0450デフォルトの名無しさん2008/06/30(月) 02:28:49
>>449
あまり詳しいことは書けないけど
XMM レジスタを使わないことが前提のアセンブリコードや CPU エミュレータがあるので
C ソースファイルをコンパイルするときに SSE コードを生成して欲しくない

あるいは浮動小数点演算自体の使用を禁止する運用も可能だけど
その場合、浮動小数点演算を使用しているソースをコンパイルエラーで弾くくらいはする必要がある
0451デフォルトの名無しさん2008/07/01(火) 16:46:13
-mno-sse2 なんてオプションはなかったよなw
0452デフォルトの名無しさん2008/07/02(水) 00:25:02
>>451

GCC 4 なら -mno-sse だけで -mno-sse2 -mno-sse3 まで付きますし
GCC 3.4 はそれらを併用しても駄目ですね
0453デフォルトの名無しさん2008/07/02(水) 00:51:05
gccのことは知らないが、
windowsだとlong modeでFDP/MMX系のレジスタは一切使わない。
スタックフレームもレジスタ優先でほとんど使わないし、
そのとき実数データの受け渡しにXMMレジスタ使ってる。
XMM使うなというのが無理な話状態なのです。
0454デフォルトの名無しさん2008/07/07(月) 00:18:00
すみません、gdbの質問をしたいのですがここでもいいですか?

gdbの中でグローバル変数の一覧を取得(表示)する方法はありますかね?
ローカル変数に関してはinfo localsがありますが。
0455デフォルトの名無しさん2008/07/07(月) 01:05:59
shell から nm 呼ぶってのは無し?
0456デフォルトの名無しさん2008/07/07(月) 02:39:05
info variables
■ このスレッドは過去ログ倉庫に格納されています