H8/3694からRX130への移行

初めて投稿させて頂きます。

・開発環境:CS+ for CC V8.03.00(YellowIDEからの移行)

現在、H8/3694用に組んだものをCS+にてRX130用プロジェクトに移行し、動作させたいと考えています。

互換性が無い移行のようで、手動で対応できるエラーについてはあらかた対応し終わったのですが、

下記のようなコンパイラ部分?に未定義エラーなどが無数に発生しており、難儀しております。

未定義であるという意味自体は分かるのですが、開発環境のインクルードファイルに発生している原因と対処が分からず、

対応方法などご教示願えれば幸いです。

 

(E) E0520020 C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.02.00\include\ios(28):E0520020:Identifier "class" is undefined ios 28 Test.mtpj

(E) E0520020 C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.02.00\include\ios(64):E0520020:Identifier "iostate" is undefined ios 64 Test.mtpj

(E) E0520020 C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.02.00\include\ios(82):E0520020:Identifier "fmtflags" is undefined ios 82 Test.mtpj

  • Thermidorさん、こんにちは。NoMaYと申します。

    それらのエラーはC++用ヘッダファイルをCファイルでインクルードしてしまった為に発生しているように思われます。(CC-RXのiosはC++用ヘッダファイルです。)

    (1) iosをインクルードしているファイルはCファイルでしょうか?C++ファイルでしょうか?(インクルードファイルのインクルード関係が巡りめぐって、Cファイルでiosがインクルードされているのではないかと予想したのですが、どうでしょうか?)

    (2) インクルードしているファイルがCファイルだった場合、YellowIDE&Yellow C(?)の場合でも、同様にCファイルからC++ヘッダファイルのiosがインクルードされていたでしょうか?

    (3) 上記の(2)は、元々はそうではないだろうな、と思うのですが、今回、そうなってしまった原因として、条件コンパイルの条件を合わせ込みきれずにインクルードされてしまったのではないかと思うのです。上記の(2)がそうではなかったのであれば、この点を見直してみてはどうでしょうか?

    (4) もし、もともとの環境で、CファイルからC++ヘッダファイルである筈のiosがインクルードされていたのであれば、もともとの環境でのiosの内容はどのようなものでしたでしょうか?ひょっとして中身が空のファイルだったりとかしないでしょうか?

  • NoMaY様、お返事ありがとうございます!
    ご確認が遅くなり、大変申し訳ございません。

    早速これら項目について確認させて頂きます!
  • 大変遅くなり申し訳ございません。

    非常に初歩的な事項で申し訳ありませんが、iosファイルというのは下記ファイルのことでしょうか。
    C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.02.00\include\ios
    (エラー発生時にタブに表れましたが、特にこれをインクルードするようソースを書き換えたことはありません)

    もしiostreamのことであれば、Cファイルから<iostream>としてインクルードされていました。
    これをコメントアウトしてみたところ、今度は0b0101~のように2進数で計算を行っている箇所すべてに;や}が抜けている旨のエラーが発生しました。
  • 調査したところ、CS+では2進数表記をサポートしていないのですね。
    これらをすべて10進数や16進数に変更し、iostreamをインクルードから外せば通る可能性があるのでしょうか。
  • Thermidorさん、こんにちは。NoMaYです。

    CC-RXのインクルードファイルを追い掛けてみると、iostreamヘッダファイルから2つほどヘッダファイルを経由してiosヘッダファイルがインクルードされることになりますね。なので、それが原因ですね。

    ただ、iostreamをインクルードから外して、2進数表記を修正して、それでコンパイル/リンクが通るようになるかは正直なところ分からないです。(私の方はYellowIDE&Yellow C(?)の仕様が分からないですので、どれだけの道のりがあるのか何とも言えないです。)

    ひとつ思ったのですが、RXマイコン用のGCCコンパイラを試してみる手もあるかも知れません。ちなみに、YellowIDEで使用されていたコンパイラがH8マイコン用のGCCコンパイラだった、とかだったりしますか?そうであれば、e2 studiという開発環境でRXマイコン用のGCCコンパイラが使えますので、コンパイラにこだわりが無ければ、そういう手段も考えられるかも知れません。

    なお、CC-RXでの2進数表記に関してはちょっと手を考えてみました。

    CC-RX向けの2進数リテラル表記もどきマクロを作ってみた(binary literal macro)
    japan.renesasrulz.com/cafe_rene/f/forum21/6721/cc-rx-2-binary-literal-macro
     

  • 確かにコンパイルが通るかどうかは謎でしたが、ひとまずの目標が定まったので大変助かりました。

    YellowIDEのコンパイラについては今調べたところ、H8用のコンパイラYCH8というものが使われているようです。
    コンパイラにこだわりはなく、マイコンをRX130に乗り換えられればよい状態です。
    e2 studiであれば通る可能性があるのであれば、そちらも試させて頂きます。

    なんと、マクロを考案して頂けるとは!
    誠にありがとうございます。2進数表記の方が都合が良い部分があるため、早速試させて頂きます。
  • Thermidorさん、こんにちは。NoMaYです。

    もっと早くに気付けば良かったのですが、あのマクロは16bit長では使えないですね。でも、16bit長までなら少し変更すれば使えます。ですが、32bit長は無理ですね。あちらのスレッドに続きを書きました。

  • NoMay様

    ありがとうございます。
    一旦、現在の2進数表記を16進数表記に書き換えることで対応を行いました。
    すると、既存のエラーはすべて解決したものの、なにやら_mainの二重定義なるエラーが発生しました。

    (E) E0562300 E0562300:Duplicate symbol "_main" in "DefaultBuild\Test.obj" Test.mtpj


    これは、過去にNoMay様が回答されているこちらの質問に似ているように思えます。
    私のケースにおいては、CS+ CCという開発環境またはプロジェクト作成時のミスが関係しているのでしょうか。
    japan.renesasrulz.com/.../e-ai-e0562300-duplicate-symbol-_add_0_pad-in-src-translator-dnn_compute-obj
  • 念の為、プロジェクトで自動生成されたと思しきTest.cのmain()の名前を変更したところ、また別のエラーとして下記が表示されました。

    (E) E0562310 E0562310:Undefined external symbol "__ei" referenced in "DefaultBuild\hogehoge.obj" Test.mtpj

    何か基本的な設定をミスしているのでしょうか……。
  • Thermidorさん、こんにちは。NoMaYです。

    > 何か基本的な設定をミスしているのでしょうか……。

    地道にコンパイラ移行作業が進行中なのだと思います。ひょっとして、コンパイラの移行作業は初めてでしょうか?

    > (E) E0562310 E0562310:Undefined external symbol "__ei" referenced in "DefaultBuild\hogehoge.obj" Test.mtpj

    __eiが見つからないということは_ei()というYCH8コンパイラにはあるがCC-RXには無い組み込み関数が使われていた、ということの筈です。名前からCC-RXの__setpsw_i()に相当すると思われますので、置き換えれば良いかと思います。(CC-RX V3.02では、__setpsw_i()に置き換えるのが手間が少ないと思います。)

    ちなみに、_di()に関しては__clrpsw_i()に置き換えれば良いかと思います。その他もろもろはYCH8とCC-RXのコンパイラのヘルプ/ドキュメントを検索して比較したりすることで分かると思います。