我的编程空间,编程开发者的网络收藏夹
学习永远不晚

无法用cgo编译

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

无法用cgo编译

php小编百草在编写代码时,经常会遇到一些问题和挑战。其中一个常见的问题是在使用cgo编译时遇到错误信息"无法用cgo编译"。这个问题可能由于各种原因引起,例如缺少依赖库、环境配置不正确等。解决这个问题需要仔细检查代码和环境,并根据具体情况进行相应的调整和修复。在本文中,我们将分享一些解决这个问题的方法和技巧,帮助大家克服这个困扰。

问题内容

您使用的 go 版本(go 版本)?

$ go version
go version go1.20.2 linux/amd64

项目结构:

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

main.go

package main

// #include "lib/lib.h"
// #include 
// #include 
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 
#include 

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);

编译时出错

/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

我期望代码能够成功编译,但不知怎的却没有。如果我正确阅读了文档,那么我必须将 lib.clib.hmain.go 文件保存在同一目录中。但我不确定这是否可以实现,或者我做错了什么。

  • 如果我将所有文件保存在同一目录示例中,则编译成功。

  • 如果我将 lib.clib.h 保留到子目录中,则编译失败

  • 如果我从 main.go 中删除一个函数 f32_123 ,那么编译也会成功,这很奇怪,这就是打开此错误的原因,以更好地理解为什么在 lib.h 时编译不会出现 printc 函数问题并且 lib.c 位于子目录中。

解决方法

首先,@jimb 不久前给出了这个已接受的答案:https://www.php.cn/link/50c57f7019bb52cfbebdfe5bdc42b422 表示在子目录中构建对象或库不是 go build 可以做的事情。

鉴于此,假设您具有以下结构:

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

以下是一些更简单的文件,可以让事情变得清晰:


struct foo {
    int x;
};
void show(struct foo *arg);

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

因此,如果您有这样的 main.go ,则可以从 go build main.go 构建所有内容:

package main

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

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

之所以有效,是因为我们实际上 #include 库的“c”源代码(隐式导入 lib/lib.h 文件)。

但是,对于更复杂的库,您可能需要将它们构建为单独的、更正常的 c 工具链,预构建步骤:

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

然后使用不同的go文件:main2.go

package main

// #cgo CFLAGS: -I${class="lazy" data-srcDIR}/lib
// #cgo LDFLAGS: -L${class="lazy" data-srcDIR}/lib -lx
// #include "lib.h"
import "C"

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

以上就是无法用cgo编译的详细内容,更多请关注编程网其它相关文章!

无法用cgo编译

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

无法用cgo编译

php小编百草在编写代码时,经常会遇到一些问题和挑战。其中一个常见的问题是在使用cgo编译时遇到错误信息"无法用cgo编译"。这个问题可能由于各种原因引起,例如缺少依赖库、环境配置不正确等。解决这个问题需要仔细检查代码和环境,并根据具体情况
无法用cgo编译
2024-02-09

Cgo 生成的源无法在 MVC 上编译

来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Cgo 生成的源无法在 MVC 上编译》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!问题内容我有一个用 cgo 制作的
Cgo 生成的源无法在 MVC 上编译
2024-04-05

java无法编译

java无法编译java无法编译原因有很多,这里说说常见的原因及解决方案。1、javac不是内部或外部命令,也不是可运行的程序出现上面这样的提示,是因为我们的java环境变量没有配置好,解决办法是在计算机系统变量Path中添加jdk目录in,然后重新打开cm
java无法编译
2014-09-20

ubuntu的php无法编译怎么办

UbuntuPHP编译失败解决指南解决PHP编译失败,请依次检查依赖项、更新软件包、配置PHP、编译PHP、安装PHP。验证安装并排除故障的其他步骤包括:检查错误消息查看日志文件检查配置选项重新运行命令寻求在线帮助
ubuntu的php无法编译怎么办
2024-04-26

ubuntu的php无法编译怎么办

ubuntu的php无法编译的解决办法:1、执行“apt-get install apache”;2、通过“apt-get install php7.0 libapache2-mod-php7.0”安装php;3、修改php配置文件即可。
2018-12-27

ubuntu中如何解决php无法编译问题

小编给大家分享一下ubuntu中如何解决php无法编译问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ubuntu的php无法编译的解决办法:1、执行“apt-
2023-06-22

使用C#编译器编译代码

要使用C#编译器编译代码,可以使用命令行工具csc.exe(C#编译器),或者使用集成开发环境(IDE)如Visual Studio。1. 使用命令行工具csc.exe:- 打开命令提示符或PowerShell。- 导航到包含源代码文件的目
2023-09-08

java无法解析的编译问题怎么解决

当Java编译器无法解析编译问题时,可以尝试以下几种方法来解决:1. 检查语法错误:首先检查代码中是否存在语法错误,如拼写错误、缺少分号等。编译器通常会给出错误提示,可以根据提示进行修正。2. 导入缺失的类:如果代码中使用了某个类,但编译器
2023-08-28

eclipse无法解析的编译问题怎么解决

要解决Eclipse无法解析的编译问题,您可以尝试以下几个步骤:1. 清理项目:在Eclipse中,选择“Project”菜单,然后选择“Clean”选项。在弹出的对话框中选择要清理的项目,然后点击“OK”按钮。这将清理项目的编译缓存,有时
2023-09-14

Python静态编译器的用法

本篇内容介绍了“Python静态编译器的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下: def OnBuildOne(s
2023-06-17

c反编译工具reflector用法

Reflector是一个强大的C#反编译工具,可以将编译后的程序集反编译为C#代码。下面是Reflector的用法:1. 下载和安装Reflector:你可以从Red Gate官方网站下载并安装Reflector。2. 打开Reflecto
2023-09-17

无法从 GoLand (Intellij Idea) 运行 go 测试:编译失败

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《无法从 GoLand (Intellij Idea) 运行 go 测试:编译
无法从 GoLand (Intellij Idea) 运行 go 测试:编译失败
2024-04-04

C++编译器无法捕捉到的错误有哪些

这篇文章主要讲解了“C++编译器无法捕捉到的错误有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++编译器无法捕捉到的错误有哪些”吧!C++是一种复杂的编程语言,其中充满了各种微妙的陷
2023-06-17

c语言编译成功无法运行怎么解决

出现编译成功但无法运行的情况,通常有以下几个原因和解决方法:1. 程序中存在错误:编译通过并不意味着程序没有错误。检查代码是否存在语法错误、逻辑错误或运行时错误。可以使用调试器来逐行调试程序,以找出错误的位置和原因,并进行修复。2. 编译选
2023-08-28

如何使用java编译器进行编译

使用Java编译器进行编译可以通过以下步骤:1. 确保已经安装了Java Development Kit (JDK)。可以通过在命令行中运行`javac -version`命令来检查是否已经安装。2. 在命令行中切换到Java源代码所在的目
2023-09-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录