2017-09-26 48 views
-1

这是我的场景: 我在一个嵌入式Linux系统上工作并获得用C++编写的共享库。除了libstdC++是必需的,这意味着额外的1M内存被占用,它运行良好。我想将共享库转换为C,以便保存1M内存。自定义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. 是否有可能使用铿锵实现我的目标?
  2. 如果可能,我该怎么做?更具体地说,我如何使用Clang删除由宏包装的代码块作为第一步?
+1

C和C++是两种不同的语言。在两种语言之间进行翻译并不容易,而且根本不容易自动化。你有没有试过从googletranslate中获取可读的东西? – user463035818

+2

你有没有第一次尝试1.'-Os' 2. rewritting C++代码编译摆脱尽可能多的模板越好(这里当然是空间/速度的权衡)3.静态链接的一切吗?如果没有,首先尝试将代码自动转换为C将不起作用。 – Paladin

+0

其实,你不需要'libstdC++',因为它是C++。你可以用'gcc'而不是'g ++'链接你的C++程序,而不是链接'libstdC++'。你必须删除所有对'std',异常,RTTI等的引用,但是你已经愿意这么做...... – rodrigo

回答

3

实践转换(半自动地)真正C++代码,以维护的C代码是不现实

我想获得可维护的C源代码以废弃原始的C++代码。

你肯定不会得到维护和可读和可移植的C代码(例如,一旦标准containers在C++中使用;他们的模板扩张可读,而且可能不便于携带的东西不同字大小,对齐,字节顺序...)。你可以改变LLVM IR到C的一些不可移植和不可读的子集

它运作良好,除了的libstdC++是必需的,这意味着额外的1M内存资源占用

或许你可以尝试连接(一切)静态;可能只有libstdc++的一部分用于您的特定应用程序。

顺便说一句,你可以从GCC获得GIMPLE,并将其转换是GIMPLE到不可读 C代码(也许用一个插件或扩展GCC MELT定制GCC)。

您也可以尝试编译与链接时优化,例如链接-flto -Os(与最近GCC或Clang)。

不要忘记,开发工作也有一定的成本。值得花费一整年的时间(或更多)为少数几个开发者的团队赢得几百千字节的值吗?在大多数情况下,将硬件升级到稍微多一点的内存会花费很少。因人而异

+0

FWIW,似乎有'-fdump-tree-gimple'这应该打印作为C代码的疙瘩。 – HolyBlackCat

+0

不完全是C,但接近它。 –

+0

非常感谢您节省时间:) – Jishu