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:
Pilihan Tambahan
Untuk menangani ralat pemaut yang berkaitan dengan rujukan perpustakaan yang hilang, cuba pilihan berikut:
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(&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!