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

Tidak dapat menyusun dengan cgo

WBOY
Lepaskan: 2024-02-09 16:21:09
ke hadapan
1262 orang telah melayarinya

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

Struktur projek:

directory structure --
example --> main.go
        -->lib
            lib.c
            lib.h
Salin selepas log masuk

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

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

lib/lib.h

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

void printc(char *str, int *t);
void f32_123(struct s1 *s);
Salin selepas log masuk

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

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

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

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

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

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

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

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

sumber:stackoverflow.com
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