在Golang开发中,调用C库是一个常见的需求,特别是在需要高性能计算或利用现有C库时。CGo是Golang提供的一个强大工具,允许Go代码直接调用C代码。然而,使用CGo时,开发者常常会遇到头文件不存在的问题,这会导致编译失败。本文将详细介绍如何在Golang中使用CGo解决头文件不存在的问题,并提供一些实用的技巧和示例。
虽然安装Go环境是已经包括了CGO,但是开发时需要在windows下是需要安装MinGW工具。同时需要保证环境变量CGO_ENABLED
被设置为1,这表示CGO是被启用的状态。
1.开启CGO_ENABLED
不开启运行程序会报如下错误:
go: no Go source files
我们这里主要以windows系统做为例子讲解。首先我们在终端运行如下命令查Go配置信息,主要查看CGO_ENABLED是否为1,。
go env
如果CGO_ENABLED不等1,则使用如下命令设置
go env -w CGO_ENABLED=1
2.安装MinGW
不安装运行程序会报如下错误:
# runtime/cgo cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%
下载新版的MinGW
那么我想下载解压即用的新版MinGW该怎么办呢?
如去github下载到的我们会看到很多下载资源,那我们选择那个呢,GitHub 上较新版的压缩包的命名又分为 msvcrt 和 ucrt。MSVCRT(Microsoft Visual C++ Runtime)和 UCRT(Universal C Runtime)是 Microsoft Windows 上的两种 C 运行时库。MSVCRT 在所有 Windows 版本上均可用,从 Windows 10 起,支持 UCRT。若支持 UCRT 则建议选择 UCRT。
我们可选选择:
- x86_64-14.2.0-release-win32-seh-msvcrt-rt_v12-rev1.7z
- x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev1.7z(我选择这个)
下载解压之后,将对应bin的路径添加到环境变量中既可(就是把bin目录添加到系统变量的path,例如我:D:\ProgramFiles\mingw64\bin)。
在终端测试
配置好后我们在终端运行下面命令,测试安装是否成功
gcc -v
安装成功则输出如下:
> gcc -v
Using built-in specs.
COLLECT_GCC=D:\ProgramFiles\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=D:/ProgramFiles/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/14.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-14.2.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64 --enable-host-shared --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libstdcxx-threads=yes --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libssp --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-win32-seh-rev1, Built by MinGW-Builds project' --with-bugurl=https://github.com/niXman/mingw-builds LD_FOR_TARGET=/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64/bin/ld.exe --with-boot-ldflags='-pipe -fno-ident -L/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64/opt/lib -L/c/buildroot/prerequisites/x86_64-zlib-static/lib -L/c/buildroot/prerequisites/x86_64-w64-mingw32-static/lib -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc'
Thread model: win32
Supported LTO compression algorithms: zlib
gcc version 14.2.0 (x86_64-win32-seh-rev1, Built by MinGW-Builds project)
到此在Go中编写或调用c语言的cgo环境配置完成了,您可愉快编写代码了
测试代码
配置好后我们运行下面的案例测试安装是否成功。
1.示例1安装go文件内编写c代码
package main
/*
#include <stdio.h>
void hello() {
printf("Hello from C!\n");
}
*/
import "C"
func main() {
C.hello()
}
2.示例2 调用外包出代码
(1)创建add.c的c文件,编写c代码注意要以;结尾。
int add(int a,int b){
return a+b;
}
(2)创建main.go的go文件,代码中的#include "add.c"就是引入c文件,开发值注意它的路径。
//go:build cgo
package main
/*
#include "add.c"
*/
import "C"
import (
"fmt"
)
func main() {
a := 3
b := 4
// 将Go语言的整数转换为C语言的整数类型
cResult := C.add(C.int(a), C.int(b))
// 将C语言的整数类型转换回Go语言的整数类型
result := int(cResult)
fmt.Println(result)
}
好啦,到这里就帮大家做好cgo开发了,希望你能把C语言和Go语言完美使用项目开发中。
需要更多go资源到GoFly全栈开发社区获取。