68user's page 掲示板

Prev< No. 3811〜3816> Next  [最新発言に戻る] [過去ログ一覧]
No. 3811 # 68user 2004/06/19 (土) 22:05:38
>>3810 どら
結局、よくわかりませんでした。

Solaris の /usr/ucb/cc はシェルスクリプトで、/usr/ccs/bin/ucbcc
を起動しています。/usr/ccs/bin/ucbcc は /opt/SUNWspro/WS6U2/bin/acc
へのシンボリックリンクになっているはず。ですから、
        ucbcc: 警告:...
というのは acc が出力しているわけです。

コンパイラは
    http://x68000.startshop.co.jp/~68user/unix/pickup?gcc
にあるように、プリプロセス・コンパイル・アセンブル・リンクという
ステップを踏みます。提示していただいた例だと、最初に /usr/ccs/bin/ucbcc
(実体は /opt/SUNWspro/WS6U2/bin/acc) が実行され、それが
    /usr/ccs/lib/cpp (プリプロセッサ)
    /opt/SUNWspro/WS6U2/bin/acomp (コンパイラ)
    /usr/ccs/bin/ld (リンカ)
を順次起動しています。

# この場合、アセンブルはコンパイラの中で行われています。

で、
      ucbcc: 警告: ld が起動される場合は、オプション .. は ld に渡されます。...
というのは、最初に起動された ucbcc が -YP,.. というオプションを
理解できなかったため、
      「わたしの知らないオプションだけど、今から起動する ld ならこの
          オプションを理解できるかもしれないので、ld に -YP を渡します」
と言っているわけです。ただし、cc に -c オプションをつけたりすると
リンクは行われないため、そういうときに備えて
      「ld を実行しないようなオプションを指定された場合は ld が
          実行されないので、結果的に -YP オプションは無視されます」
とも言ってます。

で、
> ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
についてですが、-YP オプションは ld に渡されます。実行結果を
見るとなぜか /usr/ccs/bin/ld に -YP が 2つ渡されてしまって
います。-YP オプションは、ライブラリを検索するディレクトリを
指定するものなので、ld は
      「ライブラリを検索するディレクトリが 2つ指定されているので、
          後の方を無視して、最初の方を使います」
と警告しています。

なぜ -YP オプションが複数渡されるのかを知りたいため、-v オプションを
つけてもらったり、env で環境変数を見せてもらったりしましたが、怪しげ
なものを見つけることはできませんでした。

> 特にldというものがいまいち理解できないのですが
ld はリンカです。例えば
>>3868 jeiu
で printf や scanf などの関数を使っていますが、これらの関数は
OS の機能として用意されているものではありませんし、コンパイラが
内蔵している機能でもありません。

/usr/lib/ の下に *.a や *.so などのファイルがあると思いますが、
ここにコンパイル済の printf や scanf が入っており、それと結合
しているわけです。それらのライブラリ関数と、あなたが作った
プログラムを結合するのがリンカの仕事で、コンパイル済の printf
や scanf はどのディレクトリに置いてあるかを指定するのが -YP
オプションです。

だらだらと書いてきましたが、ぶっちゃけて言うと一般的な解決方法は
      Solaris では /usr/ucb/cc を使わず、/opt/SUNWspro/bin/cc を
      使う。できれば PATH から /usr/ucb/cc を削除した方がよい
というもので、これはよく知られたノウハウです。/usr/ucb は
SunOS4 時代 (20年くらい前) との互換性のためのディレクトリで
あって、今どき積極的に使う必要性はありません。

ただ、わたしは根本的な原因を知りたかったので しつこく聞いて
みたのですが、実を結ばなかったようで誠に残念です。


以下は余談ですが、あなたの環境のコンパイラはおそらく Forte C update 2
という Sun の製品です。わたしの手元には Solaris2.6 + Sun Workshop
(Forte C の前バージョン。Sun の製品) がありますが、いくら頑張っても
同じエラーメッセージを出すことができませんでした。

よって、多分 Forte C の不具合ではないかと予想しています。

No. 3812 # zsh 2004/06/19 (土) 23:32:29
>>3811 68user
>>3810 どら
富士通のコンパイラも入っていそうだという事が気になるのですが・・・
/usr/ccs/bin/ucbcc は Forte へのシンボリックリンクになってますか?

No. 3813 # 68user 2004/06/20 (日) 00:12:16
>>3812 zsh
> 富士通のコンパイラも入っていそうだという事が気になるのですが・・・
/opt/FSUNf90/bin とかですか? Fortran のコンパイラと見たので
特に関係はないかと判断したのですが、どうなんでしょうね。

No. 3814 # どら 2004/06/20 (日) 21:09:26
>>3811 68user
お手数をおかけしてすいませんでした。
説明がわかりやすくてうれしかったです!!

PATHから/usr/ucb/ccを削除してみました。
そしたらいままでの警告文はなくなりました!!ありがとうございました。
しかし今までになかった警告文がでました。

-------------------------------------------------------------------
"ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
-------------------------------------------------------------------

というものでした。今まではこんな警告もなかったし、3行目の空白も見当たりません。
この前載せたプログラムと同じものなのですが、#includeと<stdio.h>の間の空白を消してみましたが同じでした。
またなにか問題なのでしょうか?他の例題に関してもまったくおんなじ警告文がでます…
この形の警告文はたいていプログラムの問題だったので、プログラムをいじれば解決していたのですが…

あと、もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが…
いろいろなホームページ上の例題をやってみたのですが、どれもうまくいかなくて…
(特に、Cのプログラムをgnuplotに出力させたいのですが、gnuplot本体を置くディレクトリの場所とか、リンクの仕方とか…)
もし時間があればでけっこうですので、少し教えていただけないでしょうか。よろしくお願いします。

No. 3815 # 68user 2004/06/21 (月) 11:07:58
>>3814 どら
> "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
ソースを少しずつ削って、この警告が出る場所を特定してください。
問題の行を特定したけれども原因がわからない場合は、
      % od -cx < ex3-1.c (最小限まで削ったファイル)
として、変な文字が入っていないか確認してください。

> もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが…
質問がある場合は
    http://www.hyuki.com/writing/techask.html
を熟読した上でお願いします。ただしこの掲示板ではこれまで gnuplot の話題が
出たことはないので、
      Gnuplot Q&A 掲示板
          http://ayapin.film.s.dendai.ac.jp/cgi-bin/trees.cgi
などで聞いた方がよいかもしれません。適切な答えをもらうにはどこで
質問するのが効果的かを見極めた上でどうぞ。

それはそれとして
> Cのプログラムをgnuplotに出力させたいのですが
やればできるでしょうけど、gnuplot の使い方としては適切ではないような気がします。

No. 3816 # どら 2004/06/22 (火) 11:16:48
>>3815 68user

>> "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
>ソースを少しずつ削って、この警告が出る場所を特定してください。
includeの文を1行全部削ってみた所、正常に動きました。
しかし、includeの文はプログラムには絶対必要なものと思っていたのですが…
include文が無くても動くということはありえるのですか?
下に正常に動いたプログラムを書きます。
-----------------------------------------------------------------------
/* 【例題3.1】 rei3_1 */

main()
{
    int a,b;

    printf("異なる2つの整数を入力してください--->");
    scanf("%d %d",&a,&b);
    if(a > b)
    printf("%d --- BIG\n",a);
    
}
------------------------------------------------------------------------

Prev< No. 3811〜3816> Next  [最新発言に戻る] [過去ログ一覧]