本篇文章给大家谈谈c语言静态库的使用方法,以及c语言调用c++静态库对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、如何在golang 中调用c的静态库或者动态库2、C语言中静态库和动态库的区别,如何使用它们3、C语言如何生成库文件?4、C语言里面的动态库和静态库5、如何生成c语言静态库以及链接静态库
如何在golang 中调用c的静态库或者动态库
Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.
举例说明一下. 下面是一个Go语言包, 包含了两个函数 — Random 和 Seed — 是C语言库中random和srandom函数的马甲.
package rand
/*
#include stdlib.h
*/ import “C” func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }
我们来看一下这里都有什么内容. 开始是一个包的导入语句.
rand包导入了”C”包, 但你会发现在Go的标准库里没有这个包. 那是因为C是一个”伪包”, 一个为cgo引入的特殊的包名, 它是C命名空间的一个引用.
rand 包包含4个到C包的引用: 调用 C.random和C.srandom, 类型转换 C.uint(i)还有引用语句.
Random函数调用libc中的random函数, 然后回返结果. 在C中, random返回一个C类型的长整形值, cgo把它轮换为C.long. 这个值必需转换成Go的类型, 才能在Go程序中使用. 使用一个常见的Go类型转换:
func Random() int { return int(C.random()) }
这是一个等价的函数, 使用了一个临时变量来进行类型转换:
func Random() int { var r C.long = C.random() return int(r) }
Seed函数则相反. 它接受一个Go语言的int类型, 转换成C语言的unsigned int类型, 然后传递给C的srandom函数.
func Seed(i int) { C.srandom(C.uint(i)) }
需要注意的是, cgo中的unsigned int类型写为C.uint; cgo的文档中有完整的类型列表.
这个例子中还有一个细节我们没有说到, 那就是导入语句上面的注释.
/*
#include stdlib.h
*/ import “C”
Cgo可以识别这个注释, 并在编译C语言程序的时候将它当作一个头文件来处理. 在这个例子中, 它只是一个include语句, 然而其实它可以是使用有效的C语言代码. 这个注释必需紧靠在import “C”这个语句的上面, 不能有空行, 就像是文档注释一样.
Strings and things
与Go语言不同, C语言中没有显式的字符串类型. 字符串在C语言中是一个以0结尾的字符数组.
Go和C语言中的字符串转换是通过C.CString, C.GoString,和C.GoStringN这些函数进行的. 这些转换将得到字符串类型的一个副本.
下一个例子是实现一个Print函数, 它使用C标准库中的fputs函数把一个字符串写到标准输出上:
package print // #include stdio.h // #include stdlib.h import “C” import “unsafe” func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }
在C程序中进行的内存分配是不能被Go语言的内存管理器感知的. 当你使用C.CString创建一个C字符串时(或者其它类型的C语言内存分配), 你必需记得在使用完后用C.free来释放它.
调用C.CString将返回一个指向字符数组开始处的指错, 所以在函数退出前我们把它转换成一个unsafe.Pointer(Go中与C的void 等价的东西), 使用C.free来释放分配的内存. 一个惯用法是在分配内存后紧跟一个defer(特别是当这段代码比较复杂的时候), 这样我们就有了下面这个Print函数:
func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }
构建 cgo 包
如果你使用goinstall, 构建cgo包就比较容易了, 只要调用像平常一样使用goinstall命令, 它就能自动识别这个特殊的import “C”, 然后自动使用cgo来编译这些文件.
如果你想使用Go的Makefiles来构建, 那在CGOFILES变量中列出那些要用cgo处理的文件, 就像GOFILES变量包含一般的Go源文件一样.
rand包的Makefile可以写成下面这样:
include $(GOROOT)/src/Make.inc
TARG=goblog/rand
CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg
然后输入gomake开始构建.
更多 cgo 的资源
cgo的文档中包含了关于C伪包的更多详细的说明, 以及构建过程. Go代码树中的cgo的例子给出了更多更高级的用法.
一个简单而又符合Go惯用法的基于cgo的包是Russ Cox写的gosqlite. 而Go语言的网站上也列出了更多的的cgo包.
最后, 如果你对于cgo的内部是怎么运作这个事情感到好奇的话, 去看看运行时包的cgocall.c文件的注释吧.
C语言中静态库和动态库的区别,如何使用它们
一般C语言写的程序可以让其他语言进行调用,比如python, java,等等
c语言有两种库类型,静态库和动态库(共享库)
命令:ar rcs libmulib.a file1.o
C语言如何生成库文件?
有一些代码,我们编程时经常用到,或者我们对某些部分很熟悉,并写出了一些可用的接口。这时,我们会考虑把这些c文件做成一个lib库,以方便自己使用,或这给别人调用。
我这里介绍下在vc++6.0下如何来制作静态库:
第一步:创建一个工程,选择Win32Static
Library,输入工程名。这时就创建好了。
第二步:工程创建好了,再点击新建,这时选择文件,选择c++
source
file选项,创建一个.c
文件。
在这个文件中,你可以写入你要做成库的c函数。当然,可以继续创建其他c文件,然后将要供外部使用的接口单独放到头文件中,一般而言,一个c文件对应一个头文件。
第三步:完成以上步骤后,我们就可以生成库了。事实上,我们点击编译即可,这时就可以生成.lib文件了。
一般情况下,是可以正常生成lib文件的。有头文件和lib文件就可以给别人用了。然后我们可以写一个测试函数来试试可不可以使用。
要调用生成的lib中的函数,就要引入头函数。这时,你把lib和头文件放入当前工程中,但build的时候却显示了连接错误。那是因为你没有把lib文件包含进来。加入下面这句话即可了:
#pragma
comment(lib,
“mylib.lib
“)
Ok,自己的lib库就这样做成了。以后可以随便调用了
C语言里面的动态库和静态库
之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:
为什么需要动态库,其实也是静态库的特点导致。
动态库特点总结:
生成动态库
如何生成c语言静态库以及链接静态库
gcc -c jinpeng.c 生成jinpeng.o文件,该步是编译过程,将jinpeng.c编译成二进制码
ar cr jinpeng.a jinpeng.o 生成库文件
gcc -o test test.c ./jinpeng.a 静态链接,将库的内容加入到输出文件中。
头文件不需要编译,直接加入就好,头文件都是一些声明,库文件是具体实现。
c语言静态库的使用方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言调用c++静态库、c语言静态库的使用方法的信息别忘了在本站进行查找喔。