2017-09-26 16 views
-1

ここに私のシナリオがあります: 私は組み込みLinuxシステムで作業しており、C++で書かれた共有ライブラリを手に入れています。それは、libstdC++が必要であることを除けばうまく動作します。これは、余分な1Mメモリが占​​有されていることを意味します。私は1Mのメモリが保存されるようにCに共有ライブラリを変換したい。ClangをカスタマイズしてC++コードをCに変換します

私はC++コードを手でCに変換する方法を知っていますが、本当に退屈です。だから私は解決策を探して、同様の質問を受け取りました:Use Clang to convert C++ to C code。ただし、生成されたコードは読み込めません。私は維持可能なCソースコードを元のC++コードを廃止するようにしたい。

私はClangの初心者です。私はそれを学んだClang can be used to build a tool that processes code。私の質問は次のとおりです:

  1. 私の目標を達成するためにClangを使用することは可能ですか?
  2. 可能であれば、どうすればいいですか?具体的には、最初のステップとしてマクロでラップされたコードブロックを削除するためにClangを使用するにはどうすればよいですか?
+1

CとC++は2つの異なる言語です。 2つの言語間の翻訳は簡単ではなく、自動化するのは簡単ではありません。 googletranslateから読み込み可能なものを取得しようと試みたことがありますか? – user463035818

+2

あなたは最初に '-Os'でコンパイルを試みましたか?2.できるだけ多くのテンプレートを取り除くためにC++コードを書き直しました(ここではもちろん空間/速度のトレードオフです)。そうでない場合は、まずコードをCに変換すると自動的に動作しません。 – Paladin

+0

実際には 'libstdC++'はC++であるため、必要ありません。あなたのC++プログラムは、 'g ++'の代わりに 'gcc'にリンクし、' libstdC++ 'にはリンクしないでください。あなたは 'std'、例外、RTTIなどの全ての参照を削除しなければならないでしょうが、すでにそれを望んでいます... – rodrigo

答えて

3

Cコードを保守する(半自動)純正C++コードを変換実際現実的ではないあります。

元のC++コードを廃止するために、Cソースコードを維持したいと考えています。

あなたは確かに、すぐに標準containersは、C++で使用されるような、例えば(保守性と読みやすいとポータブルCコードを取得することはありません。自分のテンプレート展開は読めない、と異なると何かにおそらく移植性がありません単語サイズ、アラインメント、エンディアンなど)。あなたは、Cのいくつかの移植不可能と読めないサブセット

それは余分1Mメモリはおそらく、あなたがリンク試みることができる

を占めていることが必要であることにlibstdC++、除いてうまく機能(すべてにLLVM IRを変換することができ)静的;特定のアプリケーションでは、おそらくlibstdc++の一部のみが使用されています。

ところで、あなたはGCCからGIMPLEを取得し、(おそらくプラグインやGCC MELT拡張子でGCCをカスタマイズすることによって)読めない CコードにそのGIMPLE変換することができます。

とリンクをコンパイルしようとすると、リンク時間の最適化が必要になることがあります。 -flto -Os(最近のGCCまたはClang)。

開発努力にもコストがかかることを忘れないでください。少数の開発者のチームが数百キロバイトを獲得するためには、一年間の仕事(またはそれ以上)を費やす価値がありますか?ほとんどの場合、ハードウェアを少しメモリを増やしてアップグレードすると、コストが大幅に下がります。 YMMV

+0

FWIWでは、ジムプルをCコードとして表示するはずの '-fdump-tree-gimple'があるようです。 – HolyBlackCat

+0

Cではありませんが、それに近いです。 –

+0

私の時間を節約してくれてありがとう:) – Jishu

関連する問題