Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengintegrasikan Fungsi Go ke dalam Projek C Sedia Ada Menggunakan GCCGO?

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

Linda Hamilton
Linda Hamiltonasal
2024-10-26 22:42:02765semak imbas

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

2. Fungsi Call Go daripada C:

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

    extern int PrintString(char*) __asm__ ("print.main.PrintString");
  • 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"); }

3. Menggunakan GCCGO untuk Membina Keseluruhan Projek:

  • Jalankan arahan berikut:

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

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;
    }
  • 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() {}

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!

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