• ベストアンサー

gcc バージョン違いによるコンパイルエラー

C言語でWeb系のプログラムを作成している者です。 以前まで、OSはFreeBSD 4.11-RELEASE-p12・gccのバージョンは2.95.4でコンパイルできていたプログラムが、OSはFreeBSD 5.4-RELEASE-p8・gccのバージョンは・gccのバージョンは 3.4.2で、今まで出なかったようなエラーが沢山出現し、コンパイルできなくなってしまいました。 OSをインストールし直すのは、既に稼働中のサイトですので厳しく、GCCのバージョンを下げるかソースを書き換えるかして対処する方向で行きたいと考えております。 しかし、gccの2.95.4の圧縮ファイルはもう、gccの公式サイトに落ちておらず、バージョンダウンは難しそうです。 gccのバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。

noname#22805
noname#22805

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に… 全文は必要ないのです。エラーが発生した部分を、エラーが再現可能な形で提示してもらえれば、おそらく問題点を指摘できます。 > int a = 0; > char b[2] = ""; > char *c[256] = {0}; > こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。 上記の表記自体は問題ありません。ただ、同じ変数に対する初期化が複数回行われていると、 error: redefinition of parameter '○○' error: previous definition of '○○' was here ということになります。 具体的には、 int a = 1; /* 別の宣言並び */ int a = 1; のように、同じ変数を二回初期化した場合です。

noname#22805
質問者

お礼

jactaさん、ご回答有難うございます。 エラーの行が多すぎて、エラー箇所を特定できないのが現状です。 もしかしますと、初期化を二回行ってしまっているかも知れません・・・。 特に、他の関数で使われている、同名の変数でエラーが発生しているみたいですので、この辺をチェックし、もう一度ソースを見直してみることに致します。

その他の回答 (4)

  • f_attck
  • ベストアンサー率33% (40/118)
回答No.5

GCCで、2.95.4から3.4.2までのバグフィックスに目を通せば 大概のことは書いていますよ。 私も同様の状況になり、上記の方法で解決しました。 お手軽な方法だと、確かコンパイル時にオプションで 指定バージョンに落とせたと思いましたが、どうでしょう。。。

noname#22805
質問者

お礼

f_attckさん、ご回答有難うございました。 バグフィクスですね。どうも英語が得意でなくて、避けておりましたが・・・それじゃ駄目ですよね。 これからは、ソフトの仕様も把握してから致します。 バージョンダウン、そんなに簡単にできるのですか! お教えくださって有難うございます。 もう一度、gccのサイトを調査してみます。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

C99規格やC++では宣言の位置に関する規定が無くなって(?)いますが、 見易さを考慮すると宣言は一箇所にまとめたほうがいいと思います。 また、ひとつの関数はひとつの仕事だけをするようにすれば、宣言の重複もおきにくくなると思います。

noname#22805
質問者

お礼

Trick--o--さん、再度ご教授を有難うございます。 同じような関数が何個も存在しているため、細かなミスが随所にあるのかも知れません。 人の作ったプログラムでしたので、あまり弄ることができず・・・。 この辺も、慣れてゆくしかないですよね。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

バージョンが2.xから3.xに変わったときに出るコンパイルエラーの多くは、処理系の癖に依存するコーディングをしていたことが原因です。具体的なエラーメッセージとソースコードがわからないと正確なことは何もわかりません。 他に、コンパイルエラーは出なくても、部分式の評価順序が変わっていたりするので、規格上、「不定」にあたる動作した実装をしていると、実行時に振る舞いが変わったりします。 バージョンダウンはできると思いますが、将来にわたって不安を残すことになるので、この機に修正することをお勧めします。なお、gccの最新バージョンは4.0.2です。3.xと4.xではまた異なるので、「不定」や「未定義」に依存しないコードを目指してください。加えて、GNU拡張に依存するより、C99に対応させる方が幾らか安全です。 今回のことは、gccが悪いのではなく、元々内在していた不具合が顕在化しただけと考えてください。

noname#22805
質問者

お礼

jactaさん、ご回答有難うございます。 ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に… int a = 0; char b[2] = ""; char *c[256] = {0}; こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。 普段PHPを使用している為、未定義・不定でも動いてしまうプログラミングばかり書いており、C言語の未定義・不定義をあまり意識していなかったのが問題かも知れません。 今後のこともありますので、正しい書き方をもう一度調べてみたいと思います。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

どの様なエラーが出るのでしょう? 基本的に、「正しい」プログラミングをしていればあまりないとは思うのですが…… 旧版には入れていた追加ライブラリを新版に入れていない、というようなことはありませんか? OS自体を変更しているようなので、そこに特化した書き方をしているとコンパイルできなくなるかもしれませんね。

noname#22805
質問者

補足

慌ててしまってすみません。エラーの内容を添付しようと思い返し、修正できないことに気付きました。 Trick--o--さん、有難うございます。 具体的なエラーは以下のような感じです。 OSに特化した部分は特にないと思いますものの、以前までsyntaxerrorの出なかった部分がエラーになっていたりと、コンパイラの仕様が変わっているような印象を受けました。 もし、何か気付く点などありましたら、ご教授頂けると幸いです。 mms_send_v2.1.c:101: error: previous definition of 'sql' was here mms_send_v2.1.c:270: error: parameter `cmd' is initialized mms_send_v2.1.c:275: error: parameter `haisin_date_tmp' is initialized mms_send_v2.1.c:276: error: parameter `start_date_tmp' is initialized mms_send_v2.1.c:277: error: parameter `buf' is initialized mms_send_v2.1.c:279: error: conflicting types for 'numrows' mms_send_v2.1.c:103: error: previous definition of 'numrows' was here mms_send_v2.1.c:281: error: redefinition of parameter 'i' mms_send_v2.1.c:104: error: previous definition of 'i' was here mms_send_v2.1.c:283: error: parameter `count' is initialized mms_send_v2.1.c:286: error: parameter `buffer' is initialized mms_send_v2.1.c:287: error: parameter `logstr' is initialized mms_send_v2.1.c:288: error: parameter `file_name' is initialized mms_send_v2.1.c:290: error: parameter `seg_flg' is initialized mms_send_v2.1.c:291: error: parameter `seg_tmp_p' is initialized mms_send_v2.1.c:294: error: parameter `seg_tmp_count' is initialized mms_send_v2.1.c:297: error: parameter `car_num' is initialized mms_send_v2.1.c:308: error: syntax error before "sprintf" mms_send_v2.1.c:1035: error: redefinition of parameter 'row' mms_send_v2.1.c:267: error: previous definition of 'row' was here mms_send_v2.1.c:1036: error: redefinition of parameter 'text_tmp' mms_send_v2.1.c:273: error: previous definition of 'text_tmp' was here mms_send_v2.1.c:1041: error: parameter `hit_text' is initialized mms_send_v2.1.c:1042: error: parameter `hit_sub' is initialized mms_send_v2.1.c:1043: error: parameter `to' is initialized mms_send_v2.1.c:1044: error: parameter `buf' is initialized mms_send_v2.1.c:1044: error: redefinition of parameter 'buf' mms_send_v2.1.c:277: error: previous definition of 'buf' was here mms_send_v2.1.c:1045: error: redefinition of parameter 'buffer' mms_send_v2.1.c:286: error: previous definition of 'buffer' was here mms_send_v2.1.c:1046: error: parameter `cmd' is initialized mms_send_v2.1.c:1046: error: redefinition of parameter 'cmd' mms_send_v2.1.c:270: error: previous definition of 'cmd' was here mms_send_v2.1.c:1047: error: parameter `kujiurl' is initialized mms_send_v2.1.c:1048: error: parameter `kensyourl' is initialized mms_send_v2.1.c:1049: error: parameter `tyusen_num' is initialized mms_send_v2.1.c:1052: error: parameter `sql' is initialized mms_send_v2.1.c:1052: error: redefinition of parameter 'sql' mms_send_v2.1.c:269: error: previous definition of 'sql' was here mms_send_v2.1.c:1053: error: parameter `text_log1' is initialized mms_send_v2.1.c:1054: error: parameter `text_log2' is initialized mms_send_v2.1.c:1055: error: redefinition of parameter 'title_tmp' mms_send_v2.1.c:273: error: previous definition of 'title_tmp' was here mms_send_v2.1.c:1056: error: parameter `start_count' is initialized mms_send_v2.1.c:1057: error: parameter `nowcount' is initialized mms_send_v2.1.c:1058: error: redefinition of parameter 'i' mms_send_v2.1.c:281: error: previous definition of 'i' was here mms_send_v2.1.c:1058: error: parameter `j' is initialized mms_send_v2.1.c:1058: error: redefinition of parameter 'j' mms_send_v2.1.c:282: error: previous definition of 'j' was here mms_send_v2.1.c:1059: error: parameter `num' is initialized mms_send_v2.1.c:1059: error: redefinition of parameter 'num'

関連するQ&A

  • gccですが、コンパイルができません!

    以下のプログラムですが #include <stdio.h> int main() { Int col; char i; scanf( "%d", &col ); for( i = 0 ; i < 26 ; i++ ){ if( i > 0 && ( i % col ) == 0 ) printf( "\n" ); printf( "%c", 'a' + i ); } return 0; } 以上のプログラムをgccでコンパイルしました。 コンパイルするために入力した文字→  gcc p.c -o p.exe 以下のエラーがでてコンパイルできません。 p.c: In function `main': p.c:4: error: `Int' undeclared (first use in this function) p.c:4: error: (Each undeclared identifier is reported only once p.c:4: error: for each function it appears in.) p.c:4: error: syntax error before "col" p.c:7: error: `col' undeclared (first use in this function) p.c:17:2: warning: no newline at end of file  以上なぜコンパイルができないのですか? よろしくお願いいたします。

  • gccでc++プログラムをコンパイルできない

    gccをインストールして使ってみたのですがc++のプログラムをコンパイルすることができません。 gcc test.ccとすると gcc: error trying to exec 'cc1plus': execvp: そのようなファイルやディレクトリはありません というエラーがでます。 ネットで調べたところg++かc++のようにコンパイルすればいいということでしたが、g++やc++とうつとcommand not found とでます。 gcc -versionで調べたところgccのバージョンは gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) です。 環境はfedora9です。fedora9をインストールしたときにgccがインストールされていなかったので yum install gcc でインストールしたのですが、これがまずかったのでしょうか? 分かっている方からするとトンチンカンな質問かもしれないのですが、どなたかよろしくお願いします。

  • AIX gcc コンパイルエラーにつきまして

    お世話になります。 Severもcもまったくわからない初心者なのですが質問させていただきます。 Make.plを実行してsoファイルを書き換えたいのですが、実行すると下記のようなエラーが出て最後までMakeが実行できません。 <ccを指定してコンパイル> 1506-507 (W) 使用できるライセンスはありません。プログラム提供者に連絡して、追加ユーザーを追加してください。 すぐにコンパイルが行われます。 <gccを指定してコンパイル> installation problem, cannot exec `cc1plus' Makeを実行したいのですがどうしたらよいでしょうか。 gccでコンパイル、他のコンパイラでの対応方法などありましたらご教授頂けると幸いです。 (ccの場合ライセンス自体が切れているっぽいのでできれば避けたいと考えています) 漠然とした質問で申し訳ないのですがよろしくお願いいたします。 OS -> AIX v4.3 cc -> CforAIX v.6 gcc -> powerpc-ibm-aix4.3.2.0 v 2.95.3

  • gccのバージョンダウン

    環境 solaris8 gcc3.4.2 GUN Make3.80 当サーバで、gccのバージョン「2.*」を使ってソフトのコンパイルをしたいのですが、バージョンダウンってできるのでしょうか? 単純に現状の/usr/localをコピーしておいて、上書きでインストール? またはgcc2.*を別フォルダにインストール?(それでいいのか不明) ご経験のある方がいらっしゃいましたら、どうかご教授のほどお願い致します。

  • コンパイルエラー?

    FreeBSD上の gcc version 2.95.3 20010315 を用いて c++のコンパイルをしようとしたのですが、 > g++ hoge.cpp hoge.cpp:414: ANSI C++ forbids dessclaration 'value' with no type と出てコンパイルできません。原因や解決策がわかる方は 教えて頂けませんでしょうか。 なお、他のソースファイルでは同様の方法でコンパイルできました。

  • gccのコンパイルが出来ません

    gcc(MinGW)をインストールをして、binにPATHを通したのですが、コンパイルしてみると gcc: installation problem, cannot exec `cc1plus': No such file or directory というエラー文がでました。 解決方法をどなたか教えて下さい;; OS は XP Professional SP2 です。 http://www.knatech.info/Dev-mingw-install.htmlを参考にしました。

  • EXIT関数のGcc3.2.3でのコンパイルエラー

    mainで異常終了するときにexit関数で終了するHP-UX Cのプログラムがあります。 これをGcc3.2.3でコンパイルすると下記のエラーとなります. これをコンパイルエラーとしない方法を教えてください。 C言語の書物上は、引数なしでもOKなのですが。 「関数 `exit' への引数が少なすぎます」

  • Windowsコモンコントロールのcygwin/gccコンパイルエラー

    以下のサイトのようなWindowsコモンコントロールのプログラムをcygwin/gccコンパイルするとエラーがでます。 (sourceのサイト) http://wisdom.sakura.ne.jp/system/winapi/common/common16.html (ビルドコマンド) gcc -mwindows -mno-cygwin -o main.exe main.cpp (エラー出力) undefined reference to `_ImageList_Destroy@4' undefined reference to `_InitCommonControls@0' undefined reference to `_ImageList_Create@20' undefined reference to `_ImageList_ReplaceIcon@12' undefined reference to `_ImageList_ReplaceIcon@12' collect2: ld returned 1 exit status make: *** [main.exe] Error 1 Windowsコモンコントロールを含んだプログラムをcygwin/gccコンパイルするにはどうすればよいでしょうか? コンパイルは出来ないのでしょうか? よろしくお願いします。

  • gcc lcrt1.o コンパイルエラー mac xcode

    Mac OS X 10.3.9のXcode 300.0上で、UNIX上で動作するC言語プログラムの開発を行っています。 デバッガ上で、エラーや警告が最後まで、一つだけ消えずに、コンパイルできません。デバッガ上のエラーは「control reaches end of non-void function」、ターミナル上から、gccでコンパイルすると、「can't locate file for: -lcrt1.o」というエラーです。 解決法をご教示ください。

  • cygwinのgccで正常にコンパイルできない。

    cygwinのgccで正常にコンパイルできない。 cygwinのvimで、以下のプログラムを書きました。 ------------------------------------------------------------- #include <stdio.h> int main(void) { int no; printf("Please input something:"); scanf("%d", &no); printf("It is %d that you input it:\n", no); return (0); } ------------------------------------------------------------- それからgccでコンパイルしました。 コマンドは以下の通りです。 $ gcc test.c すると以下のエラーが出ました。 test.c:10:9: warning: unknown escape sequence: '\033' このようにコンパイルできない状態です。 どのようにすると正常にコンパイルできるようになるでしょうか?