欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang動態(tài)庫(so)生成與使用方法教程

 更新時間:2023年07月21日 12:03:00   作者:三雷科技  
這篇文章主要給大家介紹了關(guān)于golang動態(tài)庫(so)生成與使用的相關(guān)資料,我們平時使用的動態(tài)庫都是由c/c++開發(fā)最后生成的.so文件,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

go語言有很多的庫,在開發(fā)c語言的時候為了快速完成某些功能,可以直接通過go語言的庫進(jìn)行調(diào)用.那么我們將go語言開發(fā)的程序編譯成so動態(tài)庫文件就可以給c或者c++程序調(diào)用.

go文件編寫

如果想要導(dǎo)出C能使用的動態(tài)庫.我們需要將函數(shù)的名稱編寫為大寫.

并且還需要添加導(dǎo)出注釋(重要) //export HelloWorld 這個注釋必須寫,并且//后面不要有空格.

package main
 
/*
#include <stdlib.h>
*/
import "C"
import "fmt"
 
//export HelloWorld
func HelloWorld(str *C.char) *C.char{
	fmt.Printf(C.GoString(str))
	return str
}
 
func main() {
 
	// fmt.Printf("Done\n")
}

so編譯命令

go mod init test
go mod tidy
go build -buildmode=c-shared -o libtest.so

編譯成功后會自動生成libtest.so 以及 libtest.h文件

可以通過一下命令檢查是否編寫編譯成功.

readelf -a libtest.so| grep -i hello

C語言測試程序

main.c文件

#include "libtest.h"
void main(int argc, char* argv[]) {
    char * str =  HelloWorld("asdf");
    print(str);
}

如果libtest.h文件為自動生成,我們可以自己手動編寫libtest.h文件

#ifndef __INTERFACE_H__
#define __INTERFACE_H__
 
char* HelloWorld(char *);
 
#endif

CMakeList.txt編寫

cmake_minimum_required(VERSION 2.8)
project(demo)
# C++11 編譯
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_STANDARD 11)
# set(CMAKE_SHARED_LINKER_FLAGS " -L./ -Wl,-rpath=./")
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
 
set( demo_SOURCE
   ${CMAKE_CURRENT_SOURCE_DIR}/main.c
)
 
link_directories(${PROJECT_SOURCE_DIR})
 
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
 
add_executable(demo ${demo_SOURCE})
 
target_link_libraries(demo -ltest ) 
 

編譯C程序

mkdir build
cd build
cmake ..
make

運行

./demo

高級用法

注意:go語言中申請的內(nèi)存不要直接c中使用,因為go語言的內(nèi)存管理是自己決定的,因此你不知道他在什么時候自動釋放,因此如果需要在go語言中使用內(nèi)容請使用c.malloc來申請內(nèi)容返回到C語言中。C語言注意要自己調(diào)用free釋放哦。

func add() (**C.char, *C.char) {
        //a := []string{"1111111111111111111", "222", "333"}
        a, err := Parsefilelist()
        if err != nil {
                fmt.Println(err)
                return nil, C.CString(err.Error())
        }
        count := len(a)
        c_count := C.int(count)
        //使用完請釋放該內(nèi)存空間,防止內(nèi)存泄露
        cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))
        b := (*[1024]*C.char)(cArray)
        for index, value := range a {
                b[index] = C.CString(value)
        }
        return (**C.char)(&b[0]), nil
}

總結(jié)

到此這篇關(guān)于golang動態(tài)庫(so)生成與使用的文章就介紹到這了,更多相關(guān)golang動態(tài)庫so使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情

    Go?并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情

    這篇文章主要介紹了Go并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情,協(xié)程是Go語言最大的特色之一,goroutine的實現(xiàn)其實是通過協(xié)程,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    這篇文章主要介紹了Go 高效截取字符串的一些思考,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Golang?WebSocket創(chuàng)建單獨會話詳細(xì)實例

    Golang?WebSocket創(chuàng)建單獨會話詳細(xì)實例

    這篇文章主要給大家介紹了關(guān)于Golang?WebSocket創(chuàng)建單獨會話的相關(guān)資料,WebSocket 協(xié)議主要為了解決基于 HTTP/1.x 的 Web 應(yīng)用無法實現(xiàn)服務(wù)端向客戶端主動推送的問題,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Golang文件讀寫操作詳情

    Golang文件讀寫操作詳情

    這篇文章主要介紹了Golang文件讀寫操作詳情,文件是數(shù)據(jù)源(保存數(shù)據(jù)的地方)的一種,文件最主要的作用就是保存數(shù)據(jù),文件在程序中是以流的形式來操作的,更多詳細(xì)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Go語言中并發(fā)的工作原理

    Go語言中并發(fā)的工作原理

    本文詳細(xì)講解了Go語言中并發(fā)的工作原理,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 一文帶你深入理解Golang中的RWMutex

    一文帶你深入理解Golang中的RWMutex

    這篇文章主要為大家詳細(xì)介紹了Golang中RWMutex的相關(guān)知識,知其然,更要知其所以然。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • Go?gin框架加載Html模板文件的方法

    Go?gin框架加載Html模板文件的方法

    這篇文章主要介紹了Go?gin框架加載Html模板文件的方法,Gin框架沒有內(nèi)置靜態(tài)文件服務(wù),但可以使用gin.Static或gin.StaticFS中間件來提供靜態(tài)文件服務(wù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • golang中為什么不存在三元運算符詳解

    golang中為什么不存在三元運算符詳解

    這篇文章主要給大家介紹了關(guān)于golang中為什么不存在三元運算符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Go語言dolphinscheduler任務(wù)調(diào)度處理

    Go語言dolphinscheduler任務(wù)調(diào)度處理

    這篇文章主要為大家介紹了Go語言dolphinscheduler任務(wù)調(diào)度處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點,別名與下劃線),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論