登录
首页 >  Golang >  Go问答

无法访问cgo中的c变量

来源:Golang技术栈

时间:2023-04-30 21:28:06 158浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《无法访问cgo中的c变量》,就很适合你!文章讲解的知识点主要包括golang,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我正在尝试在 cgo 中访问 ac struct,但是去这个

无法确定 C.utmpx 的名称类型

utmpx 是 ac 结构

这里是去代码:

/*
#include 
#include 
#include 
#include 
#include 
*/
import "C"

type record C.utmpx

fd, err := os.Open(C._PATH_UTMPX) // this works
fd, err := os.Open(C.UTMPX_FILE)  // error

在 utmpx.h 文件中,有

 #define    _PATH_UTMPX     "/var/run/utmpx"
 #define    UTMPX_FILE  _PATH_UTMPX

我可以使用 _PATH_UTMPX 但在使用 UTMPX_FILE 时会收到相同的警告,为什么?

似乎我无法访问在 .h 文件中声明的这些变量我该怎么做?

平台:macOS sirria,go 1.8

正确答案

#define 对 CGo 有问题。我可以让它在 Linux amd64 上与 Go 1.8.1 一起工作,如下所示:

package main

import "os"

/*
#define _GNU_SOURCE 1
#include 
#include 
#include 
#include 
#include 

char *path_utmpx = UTMPX_FILE;

typedef struct utmpx utmpx;
*/
import "C"

type record C.utmpx

func main() {
    path := C.GoString(C.path_utmpx)
    fd, err := os.Open(path)
    if err != nil {
        panic("bad")
    }
    fd.Close()
}
  1. 我必须定义 _GNU_SOURCE 才能获得 UTMPX_FILE 定义。
  2. 我必须创建 path_utmpx 变量来解决 CGo 的 #define 问题。
  3. 我必须执行 typedef 才能type record C.utmpx编译。
  4. 使用 Go,您不能直接使用 C 字符串。您必须将它们转换为 Go 字符串。同样,如果你想用 Go 字符串调用 C 函数,你必须将它们转换为 C 字符串(并释放堆中分配的空间)。

几点建议:

祝你好运!

终于介绍完啦!小伙伴们,这篇关于《无法访问cgo中的c变量》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>