首頁 >後端開發 >Golang >如何在 C 程式中呼叫 Go 程式碼?

如何在 C 程式中呼叫 Go 程式碼?

DDD
DDD原創
2024-12-27 07:41:17998瀏覽

How Can I Call Go Code from Within a C Program?

將Go 與現有C 專案整合:從C 呼叫Go 程式碼

自Go 1.5 發布以來,出現了將Go 與現有C 專案整合的可能性。本指南旨在解決如何從 C 程式中呼叫 Go 程式碼的問題。

Go 1.5 引入了 -buildmode=c-archive 選項,促進了 C 可呼叫存檔的產生。然而,產生必要的頭檔可能會帶來挑戰。要解決此問題,將函數標記為導出的 CGo 符號至關重要。

為了說明這一點,請考慮foo.go 中的以下Go 程式碼:

package main

import (
    "C"
    "fmt"
)

//export PrintInt
func PrintInt(x int) {
    fmt.Println(x)
}

func main() {}

將此程式碼編譯為C -可呼叫靜態函式庫,執行下列指令:

go build -buildmode=c-archive foo.go

該指令將產生一個存檔(foo.a)和一個頭檔(foo.h)。頭檔將包含以下聲明:

typedef long long GoInt64;
typedef GoInt64 GoInt;
extern void PrintInt(GoInt p0);

使用這些聲明,現在可以從C 程式呼叫匯出的函數:

#include "foo.h"

int main(int argc, char **argv) {
    PrintInt(42);
    return 0;
}

要編譯此C 程式:

gcc -pthread foo.c foo.a -o foo

-pthread 選項是必要的,因為Go 執行緒使用執行緒。執行後,程式將輸出 42。

透過執行以下步驟,您可以在現有 C 專案中有效地使用 Go 程式碼,受益於 Go 的進階功能,同時保留 C 提供的低階存取權.

以上是如何在 C 程式中呼叫 Go 程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn