0

0

Go语言与C++代码集成:使用SWIG而非已废弃的Makefile方法

碧海醫心

碧海醫心

发布时间:2025-11-11 18:05:26

|

860人浏览过

|

来源于php中文网

原创

Go语言与C++代码集成:使用SWIG而非已废弃的Makefile方法

本文旨在解决go语言与c++++代码集成时遇到的`make.`和`make.pkg`文件缺失错误。此错误源于尝试使用已废弃的makefile方法。正确的解决方案是采用swig工具链,它能有效桥接go与c++代码,提供现代且推荐的互操作性途径,避免旧有构建机制引发的问题,确保go程序能够顺利调用c++功能。

在Go语言开发中,当需要与既有的C或C++代码进行交互时,开发者可能会尝试通过传统的Makefile方式来构建和链接。然而,对于某些早期或已废弃的Go版本构建脚本,例如依赖于/usr/local/go/src/Make.或/usr/local/go/src/Make.pkg的机制,现代Go环境将不再支持,从而导致以下类似的文件未找到错误:

Makefile:3: /usr/local/go/src/Make.: No such file or directory
Makefile:4: /usr/local/go/src/Make.pkg: No such file or directory
Makefile:6: *** missing separator.  Stop

这些错误明确指出,Go语言不再使用其内部的Make.和Make.pkg文件来处理外部代码的链接。这种基于Go源代码树内部Make文件的做法已经过时并被废弃。尝试使用这种方法将无法成功地将C++代码集成到Go项目中。

现代Go与C++互操作性解决方案:SWIG

Go语言官方FAQ明确指出,为了与C++代码进行交互,推荐使用诸如SWIG(Simplified Wrapper and Interface Generator)之类的工具。SWIG是一个开源的工具,它可以自动生成不同编程语言(包括Go)与C/C++库之间的接口代码。通过SWIG,开发者可以避免手动编写复杂的胶水代码,从而更高效、更可靠地实现Go与C++的互操作。

SWIG的工作原理

SWIG通过读取一个接口定义文件(通常是.i文件),该文件描述了C/C++库中希望暴露给Go语言的函数、类和变量。然后,SWIG会生成两部分代码:

立即学习go语言免费学习笔记(深入)”;

  1. C/C++包装器代码:这些代码负责处理Go语言和C/C++数据类型之间的转换,并调用实际的C/C++库函数。
  2. Go语言包装器代码:这些代码提供Go语言接口,允许Go程序以Go的语法调用C/C++功能。

使用SWIG集成C++代码的基本步骤

以下是使用SWIG将C++代码集成到Go项目中的基本流程概述:

  1. 安装SWIG: 首先,确保您的系统上安装了SWIG。大多数Linux发行版和macOS可以通过包管理器安装,Windows用户可以从SWIG官网下载。

  2. 准备C++代码: 假设您有一个简单的C++库,例如example.h和example.cpp:

    example.h:

    #ifndef EXAMPLE_H
    #define EXAMPLE_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int add(int a, int b);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // EXAMPLE_H

    example.cpp:

    #include "example.h"
    
    int add(int a, int b) {
        return a + b;
    }

    请注意,为了与Go(通过CGO)更好地兼容,通常会使用extern "C"来暴露C风格的函数接口。

  3. 创建SWIG接口文件 (.i): 创建一个.i文件,例如example.i,来定义您希望Go访问的C++接口。

    example.i:

    Murf AI
    Murf AI

    AI文本转语音生成工具

    下载
    %module example
    %{
    #include "example.h"
    %}
    %include "example.h"

    这里的%module example定义了Go模块的名称。%{...%}块中的内容会被直接插入到生成的C/C++包装器代码中。%include "example.h"指示SWIG解析example.h头文件。

  4. 生成Go和C/C++包装器代码: 在命令行中运行SWIG,指定目标语言为Go:

    swig -go -c++ -cgo -o example_wrap.cxx example.i

    这会生成example_wrap.cxx(C++包装器)和example.go(Go语言接口文件)。

  5. 编写Go主程序: 创建一个Go文件,例如main.go,来调用SWIG生成的接口:

    main.go:

    package main
    
    import (
        "fmt"
        "./example" // 导入SWIG生成的Go包
    )
    
    func main() {
        result := example.Add(10, 20)
        fmt.Printf("Result of add(10, 20): %d\n", result)
    }

    注意:./example是根据%module example生成的Go包名。

  6. 构建Go项目: 使用Go命令行工具来构建您的项目。Go的cgo工具会自动处理C/C++代码的编译和链接。

    go mod init myproject # 如果是新项目
    go build -x -v

    go build命令会自动调用C++编译器(如g++)编译example.cpp和example_wrap.cxx,并将它们与Go代码链接起来。

  7. 运行程序

    ./myproject

    您应该会看到输出:Result of add(10, 20): 30。

注意事项与总结

  • Go版本兼容性:确保您使用的Go版本与SWIG以及C++编译器兼容。
  • CGO:SWIG生成的Go代码依赖于Go的cgo机制来调用C/C++函数。因此,构建过程中cgo必须启用。
  • 头文件路径:如果您的C++头文件不在标准路径下,可能需要在SWIG命令中使用-I选项指定头文件搜索路径。
  • 复杂类型:对于更复杂的C++类、模板或STL容器,SWIG提供了丰富的特性和宏来处理这些情况,但可能需要更复杂的.i文件配置。
  • 错误排查:如果遇到链接错误,请检查C++编译器是否正确安装,以及所有相关的C++源文件和库是否都已包含在构建过程中。

总之,当尝试在Go项目中集成C++代码并遇到Make.: No such file or directory这类错误时,请明确这是因为采用了Go语言已废弃的旧有构建方法。正确的现代实践是利用SWIG这样的工具来自动化生成Go与C++之间的接口代码,并通过Go的cgo机制进行编译和链接,从而实现高效、可靠的跨语言调用。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

295

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

988

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

44

2025.10.17

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

441

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.10.13

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

81

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.2万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号