Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

gccコンパイルオプションについて

0 views
Skip to first unread message

Koji Tsubota

unread,
Jan 17, 2003, 10:59:42 AM1/17/03
to
KOJIと申します。

●質問
GCCに”-D”のコンパイラのコンパイラオプションがあると思います。
コマンドで、下記のようにコンパイルすると
gcc -DKOJI Helllo.c
Cソースで
#define KOJI 1
と同様の効果が得られるわけですが、#defineではなく
makefileに記載する事により、同様の効果が得られる方法は有るのでしょうか?
ご教示願いたくよろしくお願いします。

--
*
by Koji
*

Hiroshi Fujishima

unread,
Jan 17, 2003, 11:27:03 PM1/17/03
to
"Koji Tsubota" <caas...@hcn.zaq.ne.jp> writes:

> GCCに”-D”のコンパイラのコンパイラオプションがあると思います。
> コマンドで、下記のようにコンパイルすると
> gcc -DKOJI Helllo.c
> Cソースで
> #define KOJI 1
> と同様の効果が得られるわけですが、#defineではなく
> makefileに記載する事により、同様の効果が得られる方法は有るのでしょうか?
> ご教示願いたくよろしくお願いします。

CPPFLAGS=-DKOJI

--
Hiroshi Fujishima

Koji Tsubota

unread,
Jan 18, 2003, 8:01:05 AM1/18/03
to
Kojiです。
ご返信ありがとうございます。

CPPFLAGS=-DKOJI
で実現できるのが分かりましたが
他の方法はないでしょうか?

Cソース上でKOJIという文字が"1”と認識
させる方法がmakefileで実現したく思います。
可能でしょうか?

makefileの先頭で KOJI=1 と書いただけでは
駄目なようですし、、、困ってます。

以上

NAKAMURA Kazushi

unread,
Jan 18, 2003, 12:55:08 PM1/18/03
to
In article <b0bj6i$3q4$1...@nsvn01.zaq.ne.jp>

caas...@hcn.zaq.ne.jp writes:
>Kojiです。
>ご返信ありがとうございます。
>
>CPPFLAGS=-DKOJI
>で実現できるのが分かりましたが
>他の方法はないでしょうか?
>
>Cソース上でKOJIという文字が"1”と認識
>させる方法がmakefileで実現したく思います。
>可能でしょうか?
>
>makefileの先頭で KOJI=1 と書いただけでは
>駄目なようですし、、、困ってます。
何をやってどう困っているのでしょうか?

CPPFLAGS=-DKOJI

で実現できると分かったからもう解決済みなのではないですか?
なのに何故、makefileでKOJI=1と書いたりしているのですか?
makefileにCPPFLAGS=-DKOJIと書いて解決しているのでしょ。
これはmakefileで解決ではないのですか?

% cat makefile
CPPFLAGS=-DKOJI
...
% make
...
--
中村和志@神戸 <mailto:k...@kobe1995.net>
NAKAMURA Kazushi@KOBE <http://kobe1995.net/>
- Be Free(BSD) or Die.

Koji Tsubota

unread,
Jan 18, 2003, 8:47:07 PM1/18/03
to
KOJIです。
CPPFLAGS=-DKOJI
で、マクロにしてコンパイル出来る事は既に知っていました。
しかし、makefileでCコンパイラのオプション”-D”の使用できる数が限られてお
り、コンパイル出来ません。
別の方法でコンパイルが出来るかどうかを考えていたわけです。

そこで、ニュースグループに投稿しました。

ご教示お願いします。

"NAKAMURA Kazushi" <k...@kobe1995.net> wrote in message
news:0301190255...@ns.kobe1995.net...

Akira Kakuto

unread,
Jan 19, 2003, 12:31:12 AM1/19/03
to
"Koji Tsubota " <caas...@hcn.zaq.ne.jp> wrote in message
news:b0bj6i$3q4$1...@nsvn01.zaq.ne.jp...

> Kojiです。
> ご返信ありがとうございます。
>
> CPPFLAGS=-DKOJI
> で実現できるのが分かりましたが
> 他の方法はないでしょうか?
>
> Cソース上でKOJIという文字が"1”と認識
> させる方法がmakefileで実現したく思います。
> 可能でしょうか?

CPPFLAGS=-DKOJI=1

--
Akira Kakuto

Junn Ohta

unread,
Jan 19, 2003, 1:05:24 AM1/19/03
to
fj.os.linuxの記事<b0d02r$s7j$1...@nsvn01.zaq.ne.jp>で
caas...@hcn.zaq.ne.jpさんは書きました。

> CPPFLAGS=-DKOJI
> で、マクロにしてコンパイル出来る事は既に知っていました。
> しかし、makefileでCコンパイラのオプション”-D”の使用できる数が限られてお
> り、コンパイル出来ません。

CPPFLAGS=-DKOJI -DFOO -DBAR -DBAZ ...

のように書けるのはご存じ? -Dオプションの数が100と
か200程度ならこれで問題なく動くと思いますが...。
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
oh...@sdg.mdd.ricoh.co.jp

koun...@mbh.nifty.com

unread,
Jan 19, 2003, 2:02:04 AM1/19/03
to
鴻池です。

"Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
news:b0df74$moq$1...@ns.src.ricoh.co.jp...
> fj.os.linuxの記事<b0d02r$s7j$1...@nsvn01.zaq.ne.jp>で
> caas...@hcn.zaq.ne.jpさんは書きました。
>


> CPPFLAGS=-DKOJI -DFOO -DBAR -DBAZ ...
>
> のように書けるのはご存じ? -Dオプションの数が100と
> か200程度ならこれで問題なく動くと思いますが...。

便乗質問ですいません。例えば,

#define hoge "hello"

みたいなのを,-D オプションで実現するにはどうすれば良いのでしょうか。


--
******************************
keizi kounoike
******************************

Hiroshi Fujishima

unread,
Jan 19, 2003, 2:22:58 AM1/19/03
to
<koun...@mbh.nifty.com> writes:

> 便乗質問ですいません。例えば,
>
> #define hoge "hello"
>
> みたいなのを,-D オプションで実現するにはどうすれば良いのでしょうか。

-Dhoge=hello

--
Hiroshi Fujishima

Koji Tsubota

unread,
Jan 19, 2003, 2:27:43 AM1/19/03
to
KOJIです。

<koun...@mbh.nifty.com> wrote in message
news:b0dj77$svp$1...@news511.nifty.com...


> 鴻池です。
>
> "Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
> news:b0df74$moq$1...@ns.src.ricoh.co.jp...
> > fj.os.linuxの記事<b0d02r$s7j$1...@nsvn01.zaq.ne.jp>で
> > caas...@hcn.zaq.ne.jpさんは書きました。
> >
> > CPPFLAGS=-DKOJI -DFOO -DBAR -DBAZ ...
> >
> > のように書けるのはご存じ? -Dオプションの数が100と
> > か200程度ならこれで問題なく動くと思いますが...。

上記方法は知ってますが、違う方法で考えてます。

>
> 便乗質問ですいません。例えば,
>
> #define hoge "hello"
>

#define hoge "hello"だと、Cソースで記述せねばならず、Cソースの修正が必要に
思います。そうなると、ソースを触る必要があると思います。
makefileのみの書き換えでは、やはり、無理ですよね?


Akira Kakuto

unread,
Jan 19, 2003, 2:29:29 AM1/19/03
to

<koun...@mbh.nifty.com> wrote in message
news:b0dj77$svp$1...@news511.nifty.com...
> 鴻池です。
>
> "Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
> news:b0df74$moq$1...@ns.src.ricoh.co.jp...
> > fj.os.linuxの記事<b0d02r$s7j$1...@nsvn01.zaq.ne.jp>で
> > caas...@hcn.zaq.ne.jpさんは書きました。
> >
> > CPPFLAGS=-DKOJI -DFOO -DBAR -DBAZ ...
> >
> > のように書けるのはご存じ? -Dオプションの数が100と
> > か200程度ならこれで問題なく動くと思いますが...。
>
> 便乗質問ですいません。例えば,
>
> #define hoge "hello"
>
> みたいなのを,-D オプションで実現するにはどうすれば良いのでしょうか。
CFLAGS = -Dhoge=\"hello\"
で行きませんか?

--
Akira Kakuto

Koji Tsubota

unread,
Jan 19, 2003, 2:36:18 AM1/19/03
to
KOJIです。

"Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
news:b0df74$moq$1...@ns.src.ricoh.co.jp...

> fj.os.linuxの記事<b0d02r$s7j$1...@nsvn01.zaq.ne.jp>で
> caas...@hcn.zaq.ne.jpさんは書きました。
> > CPPFLAGS=-DKOJI
> > で、マクロにしてコンパイル出来る事は既に知っていました。
> > しかし、makefileでCコンパイラのオプション”-D”の使用できる数が限られて

> > り、コンパイル出来ません。
>
> CPPFLAGS=-DKOJI -DFOO -DBAR -DBAZ ...
>
> のように書けるのはご存じ? -Dオプションの数が100と
> か200程度ならこれで問題なく動くと思いますが...。
> --

上記方法も知ってますが、他に方法があれば知りたく思うのですが。。。。。
-Dでは、限界があります。Cソース書き換えを行わずmakefileでの他の方法が
有れば教えてください。


Junn Ohta

unread,
Jan 19, 2003, 3:28:15 AM1/19/03
to
fj.os.linuxの記事<b0dkhi$8ss$1...@nsvn01.zaq.ne.jp>で
caas...@hcn.zaq.ne.jpさんは書きました。
> -Dでは、限界があります。

数の制限も文字列の記述も問題ないとして、何が限界な
のかわかりません。もう少し詳しく書けませんか?

> Cソース書き換えを行わずmakefileでの他の方法が
> 有れば教えてください。

makefileでできることは、gccのコマンドラインオプシ
ョンを指定することだけです。やりたいことがgccの-D
オプションでは書けないのなら、makefileでも実現でき
ません。

Koji Tsubota

unread,
Jan 19, 2003, 3:54:57 AM1/19/03
to
KOJIです。

"Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message

news:b0dniv$ovd$1...@ns.src.ricoh.co.jp...


> fj.os.linuxの記事<b0dkhi$8ss$1...@nsvn01.zaq.ne.jp>で
> caas...@hcn.zaq.ne.jpさんは書きました。
> > -Dでは、限界があります。
>

-Dの使用できるオプションの数に制限がある為です。

> 数の制限も文字列の記述も問題ないとして、何が限界な
> のかわかりません。もう少し詳しく書けませんか?
>
> > Cソース書き換えを行わずmakefileでの他の方法が
> > 有れば教えてください。
>
> makefileでできることは、gccのコマンドラインオプシ
> ョンを指定することだけです。やりたいことがgccの-D
> オプションでは書けないのなら、makefileでも実現でき
> ません。

返答有難う御座います。
Cソースに#defineで定義しなおすことを検討します。

ご返答有難う御座いました。

以上

koun...@mbh.nifty.com

unread,
Jan 19, 2003, 4:27:05 AM1/19/03
to
鴻池です。

"Akira Kakuto" <kak...@fuk.kindai.ac.jp> wrote in message
news:ttsW9.28581$ZS4.5...@news1.rdc1.ky.home.ne.jp...


>
> <koun...@mbh.nifty.com> wrote in message
> news:b0dj77$svp$1...@news511.nifty.com...

> > 便乗質問ですいません。例えば,
> >
> > #define hoge "hello"
> >
> > みたいなのを,-D オプションで実現するにはどうすれば良いのでしょうか。
> CFLAGS = -Dhoge=\"hello\"
> で行きませんか?

なるほど,理由はよく分かりませんが,バッチリです。(どこにそんなこと書いてあ
るんだろう?。)
有難うございました。

NIDE Naoyuki

unread,
Jan 19, 2003, 4:50:28 AM1/19/03
to
In article <b0dp4v$b82$1...@nsvn01.zaq.ne.jp>,
caas...@hcn.zaq.ne.jp writes:
> -Dの使用できるオプションの数に制限がある為です。

おそらくそれは間違いで、原因は何か他のところにあります。問題の生じる
Makefileやソース(問題が起こる最小限のもの)を投稿する方が、的確な回答が得
られるでしょう。
ni...@ics.nara-wu.ac.jp

kimura

unread,
Jan 19, 2003, 7:45:08 AM1/19/03
to
きむらと申します。

"Koji Tsubota" <caas...@hcn.zaq.ne.jp> wrote in message

news:b0dp4v$b82$1...@nsvn01.zaq.ne.jp...
> KOJIです。
>
> Cソースに#defineで定義しなおすことを検討します。

どうしたいのかがよく解らないのですが。。。

いわゆるソースコードの記述されたファイルを触るのを嫌っているのであれば、
変更したい#defineだけを定義したファイルを作っておいて、
それを#includeしておくというのではだめなのでしょうか?


d_o...@par.odn.ne.jp

unread,
Jan 19, 2003, 8:51:23 AM1/19/03
to d_o...@par.odn.ne.jp
小川と申します.

At Sat, 18 Jan 2003 22:01:05 +0900,
Koji Tsubota <caas...@hcn.zaq.ne.jp> wrote:
>
> Kojiです。
>
> CPPFLAGS=-DKOJI
> で実現できるのが分かりましたが
> 他の方法はないでしょうか?

gcc には -imacros というオプションがあり,
これを使うと以下のようなことが可能です.

[使用例]

○ ソースファイル main.c
$ cat main.c
int main(int argc, char **argv)
{
printf("%s %d\n", S1, NUM1);
return 0;
}

○ 別に用意したマクロ定義用ファイル macros.h
$ cat macros.h
#define S1 "USO"
#define NUM1 800

○ 一応 Makefile
$ cat Makefile
all:
gcc main.c -imacros macros.h

○ コンパイル & 実行
$ make
gcc main.c -imacros macros.h
$ ./a.out
USO 800

この方法だと余計なファイルが一つ増えてしまいますが,
ソースに手を加えることは避けられます.
仮に -D の使用回数に制限がある環境があるとしても,
その影響は受けないと思われます.

/* ***************************
OGAWA, Daisuke
e-mail: d_o...@par.odn.ne.jp
* *************************** */

KATAYAMA Yoshio

unread,
Jan 19, 2003, 10:04:34 PM1/19/03
to
In article <b0drn6$n0b$1...@news512.nifty.com>,
<koun...@mbh.nifty.com> writes:

>> CFLAGS = -Dhoge=\"hello\"
>> で行きませんか?

>なるほど,理由はよく分かりませんが,バッチリです。(どこにそんなこと書いてあ
>るんだろう?。)

シェルの man ページに書かれているはずです。RedHat 7.3 では、

$ man bash
・・・
QUOTING
・・・
A non-quoted backslash (\) is the escape character. It
preserves the literal value of the next character that
follows, with the exception of <newline>. If a \<newline>

同様に、

CFLAGS = -Dhoge='"hello"'

でも OK です。
--
片山@PFU

Kazuo Fox Dohzono

unread,
Jan 20, 2003, 4:56:28 AM1/20/03
to
In article <KATE.03Ja...@flash.tokyo.pfu.co.jp>
ka...@pfu.fujitsu.com (KATAYAMA Yoshio) writes:

> シェルの man ページに書かれているはずです。

…Linux のマニュアル, 「役に立たない」と思ったことはないですか? 私は
最近 man page を読まない人の気持ちが少しだけわかった気がします.

# ↑は疲れた声で読んでください. 作年末から小さなシステムを作ろうと四苦
# 八苦していたので.

たとえば lilo.conf の ramdisk=xxx の単位は何かとか, fsck -t vfat
(fsck.vfat?) のオプションには存在しないものがマニュアルにあったりとか.
いや, 確かに FreeBSD にもそういうのが無いとはいいませんよ. でも, ねえ….

あまり日常的に使われないコマンド群のせいかもしれませんが, この一ヶ月で
二桁回数くらいそういうのに当った気がします.

あ, 参照していたのは英文マニュアルです.
--
Kazuo Fox Dohzono / doh...@hf.rim.or.jp

Shinji KONO

unread,
Jan 20, 2003, 5:09:14 AM1/20/03
to
河野 真治@琉球大情報工学です。

In article <b0ghc8$2l6h$2...@news2.rim.or.jp>, doh...@hf.rim.or.jp (Kazuo Fox Dohzono) writes


>> シェルの man ページに書かれているはずです。
>
>…Linux のマニュアル, 「役に立たない」と思ったことはないですか? 私は
>最近 man page を読まない人の気持ちが少しだけわかった気がします.

info の方にいろいろ書いてあることが多いようです。ところが、info
の方は巨大すぎるんだよね。

>たとえば lilo.conf の ramdisk=xxx の単位は何かとか, fsck -t vfat
>(fsck.vfat?) のオプションには存在しないものがマニュアルにあったりとか.
>いや, 確かに FreeBSD にもそういうのが無いとはいいませんよ. でも, ねえ….

lilo は、もっとも複雑なものの一つだからなぁ。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球大学工学部情報工学科,
科学技術振興事業団さきがけ研究21(機能と構成)

Takashi SHIRAI

unread,
Jan 20, 2003, 7:00:29 AM1/20/03
to
 しらいです。

In article <KATE.03Ja...@flash.tokyo.pfu.co.jp>,


KATAYAMA Yoshio <ka...@pfu.fujitsu.com> wrote:
>>> CFLAGS = -Dhoge=\"hello\"
>>> で行きませんか?

>CFLAGS = -Dhoge='"hello"'
>
>でも OK です。

 portability を考えるなら後者の方が無難ですね。Makefile 内
の「\」の扱いについては実装がまちまちで、「\」を幾つ追加した
ら /bin/sh に「\」として渡されるのかが OS や version によっ
て異なるからです。
 この例でも、環境によっては「CFLAGS = -Dhoge=\\"hello\\"」
と記述する必要が出て来ると思います。場合によっては 4 つかも。

 最近の fj.unix の記事でもありましたが、Makefile 内の「\」
の扱いは POSIX の中ですら二転三転しているようですから、Linux
という platform に限った場合でも version 依存が出て来る可能
性がありますね。
 一方の「'」や「"」は Makefile の command line 中では meta
character 扱いになっていないので、そのまま shell に渡される
ことが期待出来ると思います。

# 因みに「hello」の部分を可変にするにはこうします。
# HELLO = hello
# CFLAGS = -Dhoge='"'$(HELLO)'"'

--
しらい たかし

koun...@mbh.nifty.com

unread,
Jan 20, 2003, 8:14:47 AM1/20/03
to
鴻池です。

"KATAYAMA Yoshio" <ka...@pfu.fujitsu.com> wrote in message
news:KATE.03Ja...@flash.tokyo.pfu.co.jp...


> In article <b0drn6$n0b$1...@news512.nifty.com>,
> <koun...@mbh.nifty.com> writes:

> >なるほど,理由はよく分かりませんが,バッチリです。(どこにそんなこと書い


てあ
> >るんだろう?。)
>
> シェルの man ページに書かれているはずです。RedHat 7.3 では、
>
> $ man bash

> 同様に、


>
> CFLAGS = -Dhoge='"hello"'
>
> でも OK です。

OKでした。make とshellの関係がよく分かっていなかったので,なぜ?となった次
第です。まあ,今もよく分かっては無いのですが。make でどのように解釈されて
shellに渡されるかとか,どこまでmakeで解釈して実行されているのとか。それで,
makeのmanをみたのですが,これはただ単にオプション関係の記述しかなく,どのよ
うな流れで解釈されているか全く説明がなかったので,そこらを記述したものがどこ
かにあるかなと思い聞いた次第です。
しかし,クォートって中々頭に残らないというか,分かったつもりでもしばらくする
と分からなくなるというか悩ましいですね。(職業プロでないので,いつもプログラ
ムに接している訳でもないのも理由の一つかも知れませんが。1番の理由は能力が足
りてないに尽きますが。)
makeの詳細なdocumentがGUNにあったので,これを読めば少しは分かるのかな。で
も,相当なページ数なので,読みきる自信なし。

グチになりましたが,理解のヒントになりました。有難うございました。また,しら
いさんの記事も大変参考になりました。

Kazuo Fox Dohzono

unread,
Jan 20, 2003, 10:02:58 PM1/20/03
to
In article <6650.10...@insigna.ie.u-ryukyu.ac.jp>
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> >…Linux のマニュアル, 「役に立たない」と思ったことはないですか? 私は
> >最近 man page を読まない人の気持ちが少しだけわかった気がします.
>
> info の方にいろいろ書いてあることが多いようです。ところが、info
> の方は巨大すぎるんだよね。

少なくともシステム関係は man page で事足りないと駄目でしょう (←古い?).

巨大かどうかは置いといて, アプリケーションの中には「こいつ info の書き
方知らないんじゃないか」と思うような見出しの奴がありますね. もう慣れた
けどたとえば欲しい情報 (オプションとか) がどの枝にあるかわかりにくい…
というより分散されちゃってる. 書いてる方は親切で分けたんだろうけど,
「自分の欲している情報」が basic なのかどうかなんてわかんないだろうに.

結局 concept index とかで見てしまうので「何のためのメニュー形式なんだ」
とか….

> lilo は、もっとも複雑なものの一つだからなぁ。

一応自分に必要だった情報は web 等から手にいれたんですけどね. この辺り
は最近の河野さんのスレッドも参考になりました.

それからモノは RedHat だったんですけど, メニュー形式で設定されるファイ
ルや項目が実際はどれなのかがわからない. 最終的にインストールする先には
メニューによる config プログラムを入れる余裕がなかったので非常に苦労し
ました. chroot? うーん…. システムが必要とするプログラム群もよくわから
なかったし. ローカル色強すぎというか.

# 「*BSD にしましょうよ!」って頑張ったんだけどなぁ.

以下, 余談.

開発用のマシン構成が

/dev/hda ← 普通の
/dev/hdd ← シリコンディスク

で, 実機にはケーブルがマスター側しかなくて

/dev/hda ← 普通の
/dev/hdb ← シリコンディスク

とかなる. どちらも BIOS で起動ハードディスクを選択してテストし, 最後は
実機で /dev/hda を外すことになります.

シリコンディスクに /etc/lilo.conf.hdd とか /etc/lilo.conf.hdb とか用意
しておいて, その時々で必要な時に

/sbin/lilo -r /mnt/hd -C /etc/lilo.conf.hdb

とかやってました. conf ファイルの中身なんてもう忘れちゃった.

そうそう, /etc/fstab はどこからでも共通となるように tune2fs で作成した
ディスクラベルを指定しました (デバイス名の変わりに LABEL= で指定する).
これは便利だと思った. FreeBSD にこれがあると root_disk_unit=? だけで完
全に切り替えられるんじゃないかな.

0 new messages