Skip to main content

moregeek program

cgo之调用静态库_zzxiaoma的博客-多极客编程

如果CGO中引入的C/C++资源有代码而且代码规模也比较小,直接使用源码是最理想的方式,但很多时候我们并没有源代码,或者从C/C++源代码开始构建的过程异常复杂,这种时候使用C静态库也是一个不错的选择。静态库因为是静态链接,最终的目标程序并不会产生额外的运行时依赖,也不会出现动态库特有的跨运行时资源管理的错误。不过静态库对链接阶段会有一定要求:静态库一般包含了全部的代码,里面会有大量的符号,如果不同静态库之间出现了符号冲突则会导致链接的失败。

我们先用纯C语言构造一个简单的静态库。

我们要构造的静态库名叫add,库中只有一个add函数,用于表示数论中的模加法运算。add库的文件都在add目录下。

add/add.h头文件只有一个纯C语言风格的函数声明:


int add(int a, int b);
add/add.c 对应函数的实现:
#include "add.h"

int add(int a, int b) {
return a+b;
}

因为CGO使用的是GCC命令来编译和链接C和Go桥接的代码。因此静态库也必须是GCC兼容的格式。

通过以下命令可以生成一个叫add.a的静态库:


$ cd ./add
$ gcc -c -o add.o add.c
$ ar rcs add.a add.o

生成add.a静态库之后,我们就可以在CGO中使用该资源了。

创建 main.go 文件如下:

package main

//#cgo CFLAGS: -I./add
//#cgo LDFLAGS: -L${SRCDIR}/add -ladd
//
//#include "add.h"
import "C"
import "fmt"

func main() {
fmt.Println(C.add(10, 5))
}

©著作权归作者所有:来自51CTO博客作者zzxiaoma的原创作品,请联系作者获取转载授权,否则将追究法律责任

#yyds干货盘点# 面试必刷top101:跳台阶_风的博客-多极客编程

1.简述:描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。数据范围:要求:时间复杂度: ,空间复杂度: 示例1输入:2返回值:2说明:青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。因此答案为2示例2输入:7返回值:212.代码实现:public class Solution { publi

#yyds干货盘点# 面试必刷top101:最小花费爬楼梯_风的博客-多极客编程

1.简述:描述给定一个整数数组  ,其中  是从楼梯第个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。数据范围:数组长度满足  ,数组中的值满足 示例1输入:[2,5,20]返回值:5说明:你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费

#yyds干货盘点# leetcode 热题 hot 100:接雨水_灰太狼_cxh的博客-多极客编程

题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2:输入:height = [4,2,0,3,2

​​vb.net的数据类型​_vb.net课程的博客-多极客编程

​VB.NET的数据类型: VB类型CLR类型名义存储空间存值范围默认值BooleanBoolean由实施平台确定True 或 FalseFalseDateDateTime8个字节公元1年1月1日0:00:00到公元9999年12月31日11:59:59 PM。其最小值CharChar2 个字节0到65535之间的字符码码位为0的字符StringString由实施平台确定0 to大约20亿(231

指针初阶_玄鸟轩墨的博客-多极客编程

序言指针这个模块是C语言里面比较难理解的的,学习成本倒是不高,就是有点费脑子.我们这里重点关注什么是指针和指针的用法.这篇博客我重新写了写了一遍,原来的那个实在太简陋了,里面新增了一下内容.地址谈到指针我们不得不说一下地址.什么是地址呢?地址就是能够标识一件事物的确切位置.这里有一个例子.张三是你的同学,一天,张三给你打电话,说李四,今天你来我家吧,我家在XXX小区XXX号楼.说完就把电话挂了.这

翻了concurrenthashmap1.7 和1.8的源码,我总结了它们的主要区别。_博学谷狂野架构师的博客-多极客编程

ConcurrentHashMap 思考:HashTable是线程安全的,为什么不推荐使用? HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。 1 ConcurrentHashMap 1.7 在JDK1.7中ConcurrentHashMap采用了数组+分段

cgo之类型转换_zzxiaoma的博客-多极客编程

在Go语言中访问C语言的符号时,一般是通过虚拟的“C”包访问,比如C.int对应C语言的int类型。有些C语言的类型是由多个关键字组成,但通过虚拟的“C”包访问C语言类型时名称部分不能有空格字符,比如unsigned int不能直接通过C.unsigned int访问。因此CGO为C语言的基础数值类型都提供了相应转换规则,比如C.uint对应C语言的unsigned int。 package

第五章 golang标识符、关键字、命名规则_彭世瑜的博客-多极客编程

标识符 identifier 数字、字母、下划线(_) 只能是字符和下划线(_)开头 标识符区分大小写 eg: var name string var age int var _sys int 关键字25个 break default func interface select case defer go map struct chan else got

cgo之调用c函数_zzxiaoma的博客-多极客编程

在go语言中如何调用自己写的c函数? 1、首先我们先建立c语言的函数,建立文件out.c #include <stdio.h>void out(const char* s) { puts(s);}这个文件有一个out函数,就是输出传入的字符串。 2、建立go语言来调用out.c这个文件 package main//void out(const char* s);import

cgo之#cgo_zzxiaoma的博客-多极客编程

在 import "C" 语句前的注释中可以通过 #cgo 语句设置编译阶段和链接阶段的相关参数。编译阶段的参数主要用于定义相关宏和指定头文件检索路径。链接阶段的参数主要是指定库文件检索路径和要链接的库文件。 // #cgo CFLAGS: -DPNG_DEBUG=1 -I./include// #cgo LDFLAGS: -L/usr/local/lib -lpng// #include &l

go执行linux命令_zzxiaoma的博客-多极客编程

首先建立一个exec.Cmd类型的值,然后执行这个类型的Start方法就可以启动命令了,获取此命令的输出管道,这个管道类型是io.ReadCloser,通过管道获取输出内容。 package mainimport ( "bytes" "fmt" "io" "os/exec")func main() { cmd0 := exec.Command("echo", "-n", "my fir

实践gof的设计模式:访问者模式_华为云开发者社区的博客-多极客编程

摘要:访问者模式的目的是,解耦数据结构和算法,使得系统能够在不改变现有代码结构的基础上,为对象新增一种新的操作。本文分享自华为云社区《​​【Go实现】实践GoF的23种设计模式:访问者模式​​》,作者:元闰子 。简介GoF 对访问者模式(Visitor Pattern)的定义如下:Represent an operation to be performed on the elements of a