分享

Golang1.7动态库的使用,C和Golang的动态库以及使用

 quasiceo 2017-03-07
标签: golang动态库
2016-09-10 15:59 1205人阅读 评论(0) 收藏 举报
分类:

版权声明:本文为博主原创文章,交流邮箱czxichen@163.com,交流群:259693140(此群不允许闲聊)

使用Golang写C的动态库,当前项目目录
root@working-srv: tree ./
./
|-- hello
|   `-- main.go
`-- main.c
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
root@working-srv: more hello/main.go 
package main

import "C"

func main() {}

//export Hello
func Hello() string {
    return "Hello"
}

//export Test
func Test() {
   println("export Test")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
root@working-srv: more main.c 
#include<libhello.h>
#include<stdio.h>

void main()
{
    GoString str;
    str=Hello();    
    Test();
    printf("%s\n",str);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
首先将hello/main.go编译成动态库,使用下面的命令
go build -x -v -ldflags "-s -w" -buildmode=c-shared  -o libhello.so hello
root@working-srv: tree ./
./
|-- hello
|   `-- main.go
|-- libhello.h
|-- libhello.so
`-- main.c
执行完毕的目录结构到多了libhello.h 和 libhello.so
使用下面的命令编译C文件.(-L指定动态链接库目录 -l指定动态链接库文件 -I指定头文件目录)
gcc -I./ -L./ -lhello -o main main.c
root@working-srv: tree ./
./
|-- hello
|   `-- main.go
|-- libhello.h
|-- libhello.so
|-- main
`-- main.c
这里可以看到编译出了main文件.
root@working-srv: ./main 
export Test
Hello

root@working-srv: ./main 
export Test
Hello

这里有个注意的地方就是main.go文件中的//export Hello 和 //export Test这个是有作用的,没有这个就不会生成对应的头文件方法.也就是此方法就不会被导出.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
项目目录
root@working-srv:/data/code/src# tree project workspace/
project
└── pro.go
workspace/
└── main.go
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

main.go

package main


import (
        "project"
)

func main() {
        project.Hello()
        project.Server(":1789")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

pro.go

package project

import (
    "fmt"
    "net/http"
)

func Hello() {
    fmt.Println("Hello this is dynamic libary")
}

func Server(laddr string) {
    http.HandleFunc("/", route)
    http.ListenAndServe(laddr, nil)
}

func route(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Reques:", r.URL.String())
    switch r.URL.Path {
    case "/":
        fmt.Fprint(w, "Welcome to czxichen blog.")
    case "/test":
        fmt.Fprint(w, r.Header)
    ()
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
使用下面命令将project编译成动态库(-ldflags "-s -w" -x -v 可以不使用)
root@working-srv:/data/code/src# go install -x -v -ldflags "-s -w" -buildmode=shared -linkshared project

使用下面命令编译main函数:
go build -ldflags "-s -w" -linkshared -o server workspac

编译之后产看依赖:
root@working-srv:/data/code/src# ldd server 
        linux-vdso.so.1 =>  (0x00007fff79dc6000)
        libruntime,sync-atomic.so => /data/go/pkg/linux_amd64_dynlink/libruntime,sync-atomic.so (0x00007fb56d2e4000)
        libproject.so => /data/code/pkg/linux_amd64_dynlink/libproject.so (0x00007fb56c7c3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb56c3f8000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb56c1da000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb56d6c7000)

至此动态库就能使用了.注意可能会报错runtime.a atomic 什么之类的错误
go install -buildmode=shared runtime sync/atomic  使用此命令解决.
编译动态库的时候project目录也是不可以删除的,否侧会报错误找不到包
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
1
0

参考知识库

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多