Bagaimana untuk Mengintegrasikan Fungsi Go ke dalam Projek C Sedia Ada Menggunakan GCCGO?

Linda Hamilton
Lepaskan: 2024-10-26 22:42:02
asal
780 orang telah melayarinya

How to Integrate Go Functions into Existing C Projects Using GCCGO?

Menggunakan Go Within Projek C Sedia Ada

Latar Belakang:
Anda mempunyai program C yang terdiri daripada berbilang objek fail yang disimpan dalam fail arkib (.a). Anda berhasrat untuk menambah fail Go baharu pada projek, menyusunnya ke dalam fail objek dan memasukkannya ke dalam arkib sedia ada.

Objektif:
Sepadukan fungsi Go ke dalam C anda program.

Proses:

1. Susun Fail Go ke dalam Fail Objek:

  • Jalankan arahan berikut:

    gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native
    Salin selepas log masuk

2. Fungsi Call Go daripada C:

  • Dalam fail c_caller.c anda, isytiharkan fungsi luaran:

    extern int PrintString(char*) __asm__ ("print.main.PrintString");
    Salin selepas log masuk
  • Dalam fungsi utama, panggil fungsi Go dan kendalikan hasilnya:

    int result = PrintString(string_to_pass);
    if (result) { printf("Everything went as expected!\n"); }
    else       { printf("Uh oh, something went wrong!\n"); }
    Salin selepas log masuk

3. Menggunakan GCCGO untuk Membina Keseluruhan Projek:

  • Jalankan arahan berikut:

    gccgo -o main c_caller.c printString.o -Wall -Werror -march=native
    Salin selepas log masuk

4. Menangani Ralat:

  • Jika anda menghadapi ralat seperti "rujukan tidak ditentukan kepada main.main", pastikan anda mempunyai fungsi utama dalam kod C anda.
  • Jika anda menghadapi ralat seperti "tidak dapat mencari -lgo," sahkan bahawa pembolehubah persekitaran LD_LIBRARY_PATH ditetapkan untuk menghala ke folder tempat libgo.so terletak.

Penyelesaian Alternatif dalam Go 1.5:

Dalam Go 1.5 (akan datang pada bulan Ogos), ciri baharu membolehkan penciptaan perpustakaan serasi C daripada kod Go. Dengan ciri ini, anda boleh membina pustaka statik atau kongsi terus daripada fail Go, menghapuskan keperluan untuk fail objek perantaraan.

Contoh:

  • Dalam main.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;
    }
    Salin selepas log masuk
  • Dalam main.go (disusun dengan go build -buildmode c-archive ... untuk statik atau go build -buildmode c-shared . .. untuk perpustakaan kongsi):

    package main
    
    import "C"
    import "fmt"
    
    //export PrintString
    func PrintString(cs *C.char) {
      s := C.GoString(cs)
      fmt.Println(s)
    }
    
    func main() {}
    Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengintegrasikan Fungsi Go ke dalam Projek C Sedia Ada 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
Artikel terbaru oleh pengarang
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!