[linux]包裝 cpp檔案讓純c編譯器編譯
許多嵌入式平台只有純c 編譯器,或是因為code size 或執行效率等問題必須使用純c 編譯器,不能使用c++。然而許多原始碼是用c++撰寫,看了不能用很可惜,總不可能看到一個就自己用c實現一次吧 ?
本文提供一方法將c++ 原始碼檔案可以用c編譯。
一言以蔽之:
**需要使用 c++ wrapper 的方式將 c++ files compile to shared library,
才能被 c 調用**
用詞說明
開始說明步驟之前定義下文會出現的名詞
用語 | 說明 | 來源 |
---|---|---|
libcpp.a | all .cpp compile to .a | 1 |
libcpp.h | header of libcpp.a | 2 |
wrapper.cpp | 本身是一個 .cpp 檔,定義function裡面使用libcpp.a ,但function parameters 必須只能使用 c語法,不過function implement 可以使用 c++ 語法 | 自己實現 |
wrapper.h | wrapper.cpp header可以被 c 調用 | 自己實現 |
main.cpp | 本身不能incldue libcpp.h 只能透過 include wrapper.h 來調用 wrapper.cpp function | 自己實現 |
libshare.so | share library 包含 wrapper.cpp + libcpp.a | 自己實現 |
架構圖
狀況一:
c++ source code & header 無法用 gcc 直接調用並compile
狀況二:
增加 wrapper.cpp and wrapper.h, compile to share lib
步驟
註 *Optional *為非必要流程,僅供驗證用
- 將所有需要的 cpp 編成 libcpp.a
- 編寫 wrapper.cpp + wrapper.h,調用 step 1 的檔案封裝成 function,function argument 避免使用 c++ 語法-> 因此wrapper header 可以被c調用
- 編寫 main.cpp include wrapper.h 調用函數
- [Optional] 階段驗證 c++ wrapper + header 可用
- 使用 g++ compile libcpp.a & wrapper.h & libcpp.h & wrapper.cpp & main.cpp 為bin
- 使用此bin 測試libcpp.a功能 & wrapper.cpp & wrapper.cpp 可用
- 使用 g++ 將 libcpp.a, libcpp.h, wrapper.cpp, wrapper.h 編譯為 libshare.so
- [Optional]達成驗證:
- rename main.cpp to main.c
- 使用 gcc compile main.c link libshare.so 編譯成 bin 並測試功能
參考
wrapping-c-objects-in-c
c++_library_in_c