[linux]包裝 cpp檔案讓純c編譯器編譯

[linux]包裝 cpp檔案讓純c編譯器編譯


許多嵌入式平台只有純c 編譯器,或是因為code size 或執行效率等問題必須使用純c 編譯器,不能使用c++。然而許多原始碼是用c++撰寫,看了不能用很可惜,總不可能看到一個就自己用c實現一次吧 ?

本文提供一方法將c++ 原始碼檔案可以用c編譯

一言以蔽之:
**需要使用 c++ wrapper 的方式將 c++ files compile to shared library,
才能被 c 調用**

用詞說明

開始說明步驟之前定義下文會出現的名詞

用語說明來源
libcpp.aall .cpp compile to .a1
libcpp.hheader of libcpp.a2
wrapper.cpp本身是一個 .cpp 檔,定義function裡面使用libcpp.a ,但function parameters 必須只能使用 c語法,不過function implement 可以使用 c++ 語法自己實現
wrapper.hwrapper.cpp header可以被 c 調用自己實現
main.cpp本身不能incldue libcpp.h 只能透過 include wrapper.h 來調用 wrapper.cpp function自己實現
libshare.soshare library 包含 wrapper.cpp + libcpp.a自己實現

架構圖

狀況一:

c++ source code & header 無法用 gcc 直接調用並compile
在这里插入图片描述

狀況二:

增加 wrapper.cpp and wrapper.h, compile to share lib
在这里插入图片描述

步驟

註 *Optional *為非必要流程,僅供驗證用

  1. 將所有需要的 cpp 編成 libcpp.a
  2. 編寫 wrapper.cpp + wrapper.h,調用 step 1 的檔案封裝成 function,function argument 避免使用 c++ 語法-> 因此wrapper header 可以被c調用
  3. 編寫 main.cpp include wrapper.h 調用函數
  4. [Optional] 階段驗證 c++ wrapper + header 可用
  • 使用 g++ compile libcpp.a & wrapper.h & libcpp.h & wrapper.cpp & main.cpp 為bin
  • 使用此bin 測試libcpp.a功能 & wrapper.cpp & wrapper.cpp 可用
  1. 使用 g++ 將 libcpp.a, libcpp.h, wrapper.cpp, wrapper.h 編譯為 libshare.so
  2. [Optional]達成驗證:
  • rename main.cpp to main.c
  • 使用 gcc compile main.c link libshare.so 編譯成 bin 並測試功能

參考

wrapping-c-objects-in-c
c++_library_in_c


  1. 3rd party lib 通常會有一個統一的進入點,即所有的.cpp -> .o
    如果沒有的話可能要自行:
    $ g++ -c .cpp
    $ ar rvs libcpp.a .o ↩︎

  2. 3rd party lib 通常會有一個統一的進入點,通常include 所有的 .h (or .hh)
    如果沒有的話,需要將 註1 使用的所有cpp 的 header 都include進去 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值