最近想在團隊中推動go在專案中更多場景的應用,提高開發效率。 但是遇到了乙個顧慮,就是有些功能庫是 c++ 寫的, 切換到 go 開發之後如果需要這些功能的話, 完全重寫乙個短期內不現實。 所以就產生了** c/c++/go 混合程式設計的想法。
很早之前就聽說 go 語言對 c 語言非常友好, 幾乎可以無縫使用 c 的一些豐富遺產。 剛學 go 的時候嘗試了一下,應該是因為參考的資料的問題, 沒有順利跑通。後來忙其他事情了,也沒有深究為什麼。
所以趁這個週末搗鼓了一下,跑通了 c/c++/go 混合程式設計。 主要參考 how-to-use-c++-in-go 和 cgo , 不過前者的回答畢竟久遠了,比如就不需要寫像作者描述的, 那麼複雜的 makefile,直接 go build 即可(可以參考我跑通的這個示例practice-cgo)。 cgo 會自動對 .cpp(.cc) 檔案呼叫 cxx (linux 下是 g++) 去編譯, 對 .c 檔案呼叫 cc (linux 下是 gcc) 去編譯。 當然前提是 cgo_enabled=「1」 (預設就是開啟的,通過 go env 可以看到)。 至於編譯和鏈結引數, 直接在 .go 檔案裡面的 import 「c」 上面注釋裡面著名即可。 import 「c」 是乙個偽模組,在該行上方注釋裡面可以寫 c**, 比如 #include 之類的都可以寫在裡面, 呼叫的時候就是用 c.*** 去呼叫。 所以對於自己的c++庫,想在 go 中呼叫, 只需要把他們封裝好 c的 .h 介面,然後再 go 中include然後呼叫即可。 因為對於對應目錄下的 .c 或者 .cpp 都會在 go build 的時候被自動編譯成鏈結庫。 甚至,連 go 中 include 的標頭檔案如果被修改了, go build 也會自動的識別並重新編譯。 也就是在 c/c++ 開發中 makefile 的作用, 在 go 中已經被 go build 直接完成了。 簡直是太體貼周到了。
當然,上面都是理論上的一些小示例而已, 實踐出真知,順手搞了乙個 jieba 分詞的 go 版本 gojieba 。 混合程式設計非常順手,比想象中順暢得多。 當然,這個專案也是我需要的,雖然現在也有其他的 jieba 分詞的 go 版本。 但是和 cppjieba 的效能差距略大,而 cppjieba 包裝而成的 gojieba 效能表現更讓我滿意。 還有就是,自己的專案,介面修訂,或者一些引數策略的修改, 這些都是在工作專案中使用時會遇到的,修改和定製都會更加順手。
對於 go 對 c/c++ 混合程式設計支援得很漂亮,『漂亮得不像實力派』。
C C 混合程式設計
c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...
( ) ( )混合程式設計例項
混合程式設計例項 首先,開啟vc,然後新建乙個win32 dynamic link library工程,然後在出現的工程型別中選擇預設的空專案 a empty dll project 即不包含任何檔案的工程 然後結束嚮導。手動新增兩個檔案,乙個 c source file 乙個 text file ...
C C 混合程式設計
分類 linux c c 2012 12 26 09 51 655人閱讀收藏 舉報cc 混合程式設計 externc cplusplus 現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙...