Golang中CGO在Windows系统下的使用指南

Golang中CGO在Windows系统下的使用指南

package main

//#include<sqlcli1.h>
import "C"

import "fmt"

func main(){
	fmt.Println(C.SQL_API_SQLCOLUMNS)
}

sqlcli1.h 文件位于 C:\Program Files\IBM\SQLLIB\include

程序文件位于 C:\Go\Programs

错误信息:

# command-line-arguments
.\calling.go:3:20: fatal error: sqlcli1.h: No such file or directory
 //#include<sqlcli1.h>
                    ^
compilation terminated.

如何将 sqlcli1.h 文件链接到 program.go 文件。

我的环境变量:

C:\Go\programs>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\rakhil\AppData\Local\go-build
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\rakhil\go
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\rakhil\AppData\Local\Temp\go-build674647070=/tmp/go-build -gno-record-gcc-switches

更多关于Golang中CGO在Windows系统下的使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中CGO在Windows系统下的使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Windows系统下使用CGO时,需要正确配置头文件的包含路径。根据您的错误信息,编译器无法找到sqlcli1.h文件。以下是解决方案:

方法1:使用CGO_CFLAGS环境变量

在编译前设置CGO_CFLAGS环境变量,指定头文件路径:

package main

/*
#cgo CFLAGS: -IC:/Program Files/IBM/SQLLIB/include
#include <sqlcli1.h>
*/
import "C"

import "fmt"

func main() {
    fmt.Println(C.SQL_API_SQLCOLUMNS)
}

方法2:通过命令行设置环境变量

在命令行中设置环境变量后编译:

set CGO_CFLAGS=-I"C:/Program Files/IBM/SQLLIB/include"
go build calling.go

或者使用PowerShell:

$env:CGO_CFLAGS='-I"C:/Program Files/IBM/SQLLIB/include"'
go build calling.go

方法3:使用绝对路径包含头文件

直接在代码中使用绝对路径:

package main

/*
#cgo CFLAGS: -I"C:/Program Files/IBM/SQLLIB/include"
#include <sqlcli1.h>
*/
import "C"

import "fmt"

func main() {
    fmt.Printf("SQL_API_SQLCOLUMNS: %d\n", C.SQL_API_SQLLCOLUMNS)
}

方法4:如果还需要链接库文件

如果还需要链接DB2的库文件,添加LDFLAGS:

package main

/*
#cgo CFLAGS: -I"C:/Program Files/IBM/SQLLIB/include"
#cgo LDFLAGS: -L"C:/Program Files/IBM/SQLLIB/lib" -ldb2cli
#include <sqlcli1.h>
*/
import "C"

import "fmt"

func main() {
    fmt.Println(C.SQL_API_SQLCOLUMNS)
}

完整的工作示例

package main

/*
#cgo windows CFLAGS: -I"C:/Program Files/IBM/SQLLIB/include"
#include <sqlcli1.h>
*/
import "C"

import "fmt"

func main() {
    // 访问DB2 CLI常量
    fmt.Printf("SQL_API_SQLCOLUMNS: %d\n", C.SQL_API_SQLCOLUMNS)
    
    // 如果需要调用DB2 CLI函数
    var henv C.SQLHENV
    ret := C.SQLAllocHandle(C.SQL_HANDLE_ENV, C.SQLHANDLE(nil), &henv)
    if ret == C.SQL_SUCCESS {
        fmt.Println("SQLAllocHandle succeeded")
        C.SQLFreeHandle(C.SQL_HANDLE_ENV, henv)
    }
}

编译命令:

set CGO_CFLAGS=-I"C:/Program Files/IBM/SQLLIB/include"
go build -o db2app.exe calling.go

关键点:

  • 使用#cgo CFLAGS:指令指定头文件路径
  • Windows路径使用正斜杠或双反斜杠
  • 路径包含空格时需要引号包围
  • 确保DB2客户端库已正确安装
回到顶部