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

DDD
Lepaskan: 2024-10-26 16:21:02
asal
413 orang telah melayarinya

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
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Membina sebagai Perpustakaan Statik:

go build -buildmode c-archive -o mygopkg.a
gcc -o main _main.c mygopkg.a -lpthread
Salin selepas log masuk

Membina sebagai Perpustakaan Berkongsi:

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

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!