zoukankan      html  css  js  c++  java
  • go 使用 c接口

    在使用go语言时, 有时为了方便可以直接调用c语言的接口与库, 不需要重复编写。 那就来说说在go语言里面如何调用c的接口

    首先编写好c语言的源文件与头文件,这里举一个简单的例子,实现一个字符串大小写转换的接口

    头文件c.h

    #pragma once
     
     #ifdef __cplusplus
     extern "C" {
     #endif
    
     int strcvt(char *src, int inlen, char **dst, int *outlen);
     int strcvt1(char *src, int inlen, char *dst, int outlen);
    #ifdef __cplusplus } #endif

      

    源文件c.c

    #include <stdio.h>
    #include <stdlib.h>      
    #include "c.h"
     
    int strcvt(char *src, int inlen, char **dst, int *outlen)
    {
        *dst = (char*)malloc(inlen);
        for (int i = 0;i < inlen; i++)
        { 
           (*dst)[i] = src[i] - 32;  
        }
        *outlen = inlen;
    }
    int strcvt1(char *src, int inlen, char *dst, int outlen)
    {
        for (int i = 0;i < inlen; i++)
        {
           dst[i] = src[i] - 32;     
        }
    }

    将c的文件编译,打包静态库

    gcc -o c.o -c c.c
     ar r libc_test.a c.o 

    接着编写go文件

    在go文件里面,添加要导入的c的头文件与静态库

    // #cgo LDFLAGS: -L . -lc_test -lstdc++  (导入c的库)
    // #cgo CFLAGS: -I ./              (导入头文件目录)
    // #include "c.h"         (包含头文件)
    注意每一行前面都要加 //

    直接给一个调用上面的字符串转换接口的例子

    package main
    
    // #cgo LDFLAGS: -L . -lc_test -lstdc++
    // #cgo CFLAGS: -I ./
    // #include "c.h"
    //#include <stdlib.h>
    import "C" 
    
    import "fmt"
    import "unsafe"
    
    func main() {
        var str1 string = "hello"
        var dstchar *C.char
        var outlen C.int
        //var by *C.char = C.malloc(100)
        by := make([]byte, 100)
        //var ss string
        C.strcvt(C.CString(str1), C.int(len(str1)), &dstchar, &outlen)
        C.strcvt1(C.CString(str1), C.int(len(str1)), (*C.char)(unsafe.Pointer(&by[0])), 100)
        fmt.Println("cvt1: ", string(by[0:4]))
        fmt.Println("len : ", outlen)
        dst := C.GoStringN(dstchar, outlen)
        C.free(unsafe.Pointer(dstchar))
        fmt.Println(dst)
    }
    

      

  • 相关阅读:
    类特性:多态
    类特性:继承
    类,对象入门
    cf round599 CDE
    cf round#598 CDEF
    高精度小数BigDecimal+二分——java
    点分治
    java——IO(普通文件,二进制文件,压缩文件 )
    JCF——Map
    JCF——set
  • 原文地址:https://www.cnblogs.com/myd620/p/7730143.html
Copyright © 2011-2022 走看看