Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh memanggil Fungsi Go daripada Program C Saya Menggunakan GCCGO?

Bagaimanakah saya boleh memanggil Fungsi Go daripada Program C Saya Menggunakan GCCGO?

DDD
DDDasal
2024-10-26 16:21:02414semak imbas

How can I Call Go Functions from My C Program Using GCCGO?

Memanggil Fungsi Go daripada Program C Menggunakan GCCGO

Pengenalan

Untuk menyepadukan kod Go dalam projek C sedia ada, seseorang mesti mencipta fail objek (.o) daripada fail Go dan memasukkannya ke dalam fail arkib (.a) projek C. Artikel ini memberikan penjelasan terperinci tentang cara untuk mencapai ini menggunakan GCCGO.

Membina Fail Objek Go

Untuk mencipta fail objek daripada fail Go, gunakan gccgo arahan dengan pilihan -c untuk menyusun fail tanpa memautkannya:

gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native

Pilihan -fgo-prefix menentukan awalan untuk simbol yang dieksport daripada fail Go.

Memautkan Fungsi Go ke Program C

Untuk memautkan fail objek Go ke program C, gunakan pengisytiharan extern dan kata kunci __asm__ dalam kod C:

<code class="c">#include <stdio.h>

extern int PrintString(char*) __asm__ ("print.main.PrintString");</code>

Ini mengisytiharkan fungsi PrintString dengan tandatangan dan nama simbol yang betul untuk GCCGO.

Kompilasi

Untuk menyusun atur cara C dengan fail objek Go, gunakan gccgo dengan -o pilihan untuk menentukan output boleh laku:

gccgo -o main c_caller.c printString.o -Wall -Werror -march=native

Mengatasi Ralat Kompilasi

Ralat kompilasi awal yang disebut dalam soalan asal menunjukkan bahawa GCCGO menjangkakan fungsi utama dalam Go fail. Walau bagaimanapun, ini tidak diperlukan apabila memaut ke program C. Untuk menyelesaikan isu ini, pastikan bahawa:

  • Fail Go tidak mengandungi fungsi utama.
  • Program C mentakrifkan fungsi utamanya sendiri.

Pilihan Tambahan

Untuk menangani ralat pemaut yang berkaitan dengan rujukan perpustakaan yang hilang, cuba pilihan berikut:

  • --static-libgo: Gunakan versi statik pustaka Go.
  • -statik: Pautan dengan perpustakaan statik dan bukannya perpustakaan kongsi.
  • -Wl,-R,/path/to/libgo.so's_folder: Tentukan laluan ke folder yang mengandungi libgo.so.

Contoh daripada Go 1.5 (Ogos 2015)

Go 1.5 memperkenalkan keupayaan untuk membina perpustakaan serasi C secara langsung menggunakan pergi alat. Kaedah ini memudahkan proses dengan ketara:

_main.c

<code class="c">#include <stdio.h>

int main()
{
    char *string_to_pass = NULL;
    if (asprintf(&amp;string_to_pass, "This is a test.") < 0) {
        printf("asprintf fail");
        return -1;
    }

    PrintString(string_to_pass);
    return 0;
}</code>

main.go

<code class="go">package main

import "C"
import "fmt"

//export PrintString
func PrintString(cs *C.char) {
    s := C.GoString(cs)
    fmt.Println(s)
}

func main() {}</code>

Membina sebagai Perpustakaan Statik:

go build -buildmode c-archive -o mygopkg.a
gcc -o main _main.c mygopkg.a -lpthread

Membina sebagai Perpustakaan Berkongsi:

go build -buildmode c-shared -o mygopkg.so
LD_RUN_PATH=$(pwd) gcc -o main _main.c mygopkg.so -lpthread

Atas ialah kandungan terperinci Bagaimanakah saya boleh memanggil Fungsi Go daripada Program C Saya Menggunakan GCCGO?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn