Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat menyusun dengan cgo

Tidak dapat menyusun dengan cgo

WBOY
WBOYke hadapan
2024-02-09 16:21:091214semak imbas

Tidak dapat menyusun dengan cgo

editor php Baicao sering menghadapi beberapa masalah dan cabaran semasa menulis kod. Salah satu masalah biasa ialah menghadapi mesej ralat "Tidak boleh menyusun dengan cgo" semasa menyusun dengan cgo. Masalah ini mungkin disebabkan oleh pelbagai sebab, seperti perpustakaan bergantung yang hilang, konfigurasi persekitaran yang salah, dsb. Menyelesaikan masalah ini memerlukan pemeriksaan teliti kod dan persekitaran, dan membuat pelarasan dan pembetulan yang sesuai berdasarkan situasi tertentu. Dalam artikel ini, kami akan berkongsi beberapa kaedah dan teknik untuk menyelesaikan masalah ini untuk membantu semua orang mengatasi masalah ini.

Kandungan soalan

Apakah versi go (versi go) yang anda gunakan?

$ go version
go version go1.20.2 linux/amd64

Struktur projek:

directory structure --
example --> main.go
        -->lib
            lib.c
            lib.h

main.go

package main

// #include "lib/lib.h"
// #include <stdio.h>
// #include <stdlib.h>
import "c"
import (
    "fmt"
    "unsafe"
)

func main() {
    cstrin := c.cstring("welcome")
    s1 := c.struct_s1{b: cstrin, a: 100}

    c.f32_123(&s1)
    cs := c.gostring(s1.b)
    fmt.println(cs)
    fmt.println(s1)
    c.free(unsafe.pointer(cstrin))
}

lib/lib.c

#include <stdlib.h>
#include <stdio.h>

void printc(char *str, int *t)
{
     str = "test";
     printf("%d\n", *t);
     *t = 30;
     printf("%s\n", str);
}

void f32_123(struct s1 *s)
{
     printf("%s\n", s->b);
     s->a = 10;
     s->b = "hello123";
     printf("%d\n", s->a);
     printf("%s\n", s->b);
}

lib/lib.h

struct s1 {
    int a;
    char *b;
};

void printc(char *str, int *t);
void f32_123(struct s1 *s);

Ralat semasa menyusun

/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: /tmp/go-link-3024881602/000001.o: in function _cgo_cf24297edd23_Cfunc_f32_123': /tmp/go-build/cgo-gcc-prolog:49: undefined reference to f32_123'
collect2: error: ld returned 1 exit status

Saya menjangkakan kod itu berjaya disusun, tetapi entah bagaimana ia tidak berjaya. Jika saya membaca dokumentasi dengan betul, saya perlu menyimpan fail lib.clib.hmain.go dan

dalam direktori yang sama. Tetapi saya tidak pasti sama ada ini mungkin atau jika saya melakukan sesuatu yang salah.
  • Jika saya menyimpan semua fail dalam contoh direktori yang sama, kompilasi berjaya.
  • lib.clib.hJika saya menyimpan

    ke dalam subdirektori, kompilasi gagal
  • f32_123 ,那么编译也会成功,这很奇怪,这就是打开此错误的原因,以更好地理解为什么在 lib.h 时编译不会出现 printc 函数问题并且 lib.cJika saya mengalih keluar fungsi daripada main.go

    terletak dalam subdirektori.

Penyelesaian

Pertama sekali, @jimb memberikan jawapan yang diterima ini sebentar tadi: a>https://www.php.cn/link/50c57f7019bb52cfbebdfe5bdc42b422go build bermakna anda membina subdirektori atau perpustakaan boleh buat benda.

Memandangkan ini, katakan anda mempunyai struktur berikut:

lib/
lib/lib.c
lib/lib.h
main.go

Berikut ialah beberapa fail yang lebih ringkas untuk menjelaskan perkara ini:

/* lib/lib.h */
struct foo {
    int x;
};
void show(struct foo *arg);
/* lib/lib.c */
#include <stdio.h>
#include "lib.h"
void show(struct foo *arg) {
    printf("[%d]\n", arg->x);
}

Jadi jika anda mempunyai main.go ,则可以从 go build main.go seperti ini, anda boleh membina segala-galanya daripada go build main.go:

package main

// #cgo cflags: -i${srcdir}/lib
// #include "lib.c"
import "c"

func main() {
    x := c.struct_foo{ x: 42 }
    c.show(&x)
}

Ini berfungsi kerana kami sebenarnya #include kod sumber "c" pustaka (mengimport fail #include 库的“c”源代码(隐式导入 lib/lib.h secara tersirat).

Namun, untuk perpustakaan yang lebih kompleks, anda mungkin perlu membinanya sebagai rantai alat c yang berasingan dan lebih biasa, langkah pra bina:

$ cd lib
$ cc -c lib.c
$ ar cr libx.a lib.o
$ cd ..

Kemudian gunakan fail go yang berbeza: main2.go:

package main

// #cgo CFLAGS: -I${SRCDIR}/lib
// #cgo LDFLAGS: -L${SRCDIR}/lib -lx
// #include "lib.h"
import "C"

func main() {
    x := C.struct_foo{ x: 42 }
    C.show(&x)
}

Atas ialah kandungan terperinci Tidak dapat menyusun dengan cgo. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam