2017-09-26 51 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