亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang 調(diào)用c語(yǔ)言動(dòng)態(tài)庫(kù)方式實(shí)現(xiàn)

 更新時(shí)間:2021年12月31日 10:47:04   作者:小_村長(zhǎng)  
本文主要介紹了golang 調(diào)用c語(yǔ)言動(dòng)態(tài)庫(kù)方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

下面我們自己在 Linux 下做一個(gè)動(dòng)態(tài)庫(kù)(.so 文件 - Shared Object),然在用 Go 來(lái)使用它。本文所用的操作系統(tǒng)為 Ubuntu18.04, 以 gcc 作為編譯器。

1.實(shí)現(xiàn)頭文件,聲明文件中函數(shù)。這里創(chuàng)建一個(gè)add.h文件。

#ifndef __ADD_H__
#define __ADD_H__
 
char* Add(char* src, int n);
 
#endif

2.實(shí)現(xiàn)add主體函數(shù)add.c

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
char* Add(char* src, int n)
{
    char str[20];
    sprintf(str, "%d", n);
    char *result = malloc(strlen(src)+strlen(str)+1);
    strcpy(result, src);
    strcat(result, str);
    return result;
}

3.用命令生成動(dòng)態(tài)庫(kù),在linux下文件名稱(chēng)是libadd.so

gcc -fPIC -shared -o lib/libadd.so include/add.c

會(huì)在當(dāng)前目錄下生成 libadd.so 文件, 在 Linux 下可用 nm -D libadd.so 查看其中的方法

4.編寫(xiě)一個(gè)庫(kù)來(lái)測(cè)試一下

#include <stdio.h>
#include "add.h"
 
int main(int argc, char *argv[])
{
    char* aa = "giter";
    printf("%s\n", Add(aa, 8));
    return 0;
}

鏈接動(dòng)態(tài)庫(kù)生成可執(zhí)行文件

gcc include/test.c -L lib/ -ladd -o test

  • -L .表示搜索要鏈接的庫(kù)文件時(shí)包含當(dāng)前目錄
  • -ladd 表示要鏈接動(dòng)態(tài)庫(kù) libadd.so (備注:默認(rèn)lib + xxx + .so ,中間的xxx就是庫(kù)名)
  • -o test 生成可執(zhí)行文件 test

錯(cuò)誤:運(yùn)行出錯(cuò)的情況

# 運(yùn)行 ./test,出錯(cuò)
./test: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

出現(xiàn)以上的錯(cuò)誤。有可能是環(huán)境變量沒(méi)弄好導(dǎo)致的,找不到動(dòng)態(tài)庫(kù) libadd.so, Linux 通過(guò) ldconfig 的指示在某些目錄中(如 /lib, /user/lib) 搜索動(dòng)態(tài)庫(kù)。更簡(jiǎn)單的辦法是用 LD_LIBRARY_PATH 環(huán)境變量。解決辦法,

$ LD_LIBRARY_PATH=lib/ ./test
giter8

至此,動(dòng)態(tài)庫(kù) libadd.so 準(zhǔn)備好了,并且用 test 驗(yàn)證了它是可用的,接下來(lái)就在 Go 語(yǔ)言中使用該動(dòng)態(tài)庫(kù)的函數(shù)。

5.golang調(diào)用c動(dòng)態(tài)庫(kù)

demo1
├── include
│     └── add.c
│     └── add.h
│     └── test.c
├── lib
│     └── libadd.so
└── main.go

main.go 的代碼如下:

package main

/*
// 頭文件的位置,相對(duì)于源文件是當(dāng)前目錄,所以是 .,頭文件在多個(gè)目錄時(shí)寫(xiě)多個(gè)  #cgo CFLAGS: ...
#cgo CFLAGS: -I./include
// 從哪里加載動(dòng)態(tài)庫(kù),位置與文件名,-ladd 加載 libadd.so 文件
#cgo LDFLAGS: -L./lib -ladd -Wl,-rpath,lib
#include "add.h"
*/
import "C"
import "fmt"
 
func main() {
  val := C.Add(C.CString("go"), 2021)
  fmt.Println("run c: ", C.GoString(val))
}

通過(guò)注釋代碼來(lái)告訴 Go 編譯器從哪里引入頭文件與加載動(dòng)態(tài)庫(kù). 本例中 *.h 和 *.go 文件在同一個(gè)目錄的情況下, #cgo CFLAGS: -I. 可不寫(xiě)。
CFLAGS: -I 和 LDFLAGS: -L 都是相對(duì)于源文件 main.go 的位置

./demo1
run c:  go2021

成功調(diào)用 C 實(shí)現(xiàn)的 add 函數(shù)
下面列出一些問(wèn)題
import "C" 要緊挨著 /*...*/ 注釋塊,如果寫(xiě)成

/*
#cgo ...
*/

import "C"

出現(xiàn)下面的報(bào)錯(cuò)信息

# demo1
./main.go:15:10: could not determine kind of name for C.Add

import "C" 要獨(dú)占一行, 試圖同時(shí)引入其他的庫(kù),如 import ("C"; "fmt") 也會(huì)報(bào)上面同樣的錯(cuò)誤
加載不到頭文件的錯(cuò)誤很明顯,#include "add.h" 時(shí)會(huì)告訴你該文件不存在,如果沒(méi)有加載到正確的頭文件調(diào)用 C.Add() 函數(shù)時(shí)就會(huì)報(bào)錯(cuò)

# demo1
./main.go:15:10: could not determine kind of name for C.Add

還有一個(gè)關(guān)鍵是能否加載到動(dòng)態(tài)庫(kù) libadd.so, 參考了網(wǎng)上一些例子,如果把第五行改為

cgo LDFLAGS: -L./lib -ladd

編譯不會(huì)報(bào)錯(cuò),執(zhí)行時(shí)會(huì)出錯(cuò)。

./demo1: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

但如果設(shè)置了環(huán)境變量 LD_LIBRARY_PATH=/home/vagrant/testgo/lib 也能讓它跑起來(lái)

LD_LIBRARY_PATH=lib/ ./demo1

到此這篇關(guān)于golang 調(diào)用c語(yǔ)言動(dòng)態(tài)庫(kù)方式實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 調(diào)用c語(yǔ)言動(dòng)態(tài)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang微服務(wù)框架Kratos實(shí)現(xiàn)Kafka消息隊(duì)列的方法

    Golang微服務(wù)框架Kratos實(shí)現(xiàn)Kafka消息隊(duì)列的方法

    消息隊(duì)列是大型分布式系統(tǒng)不可缺少的中間件,也是高并發(fā)系統(tǒng)的基石中間件,所以掌握好消息隊(duì)列MQ就變得極其重要,在本文當(dāng)中,您將了解到:什么是消息隊(duì)列?什么是Kafka?怎樣在微服務(wù)框架Kratos當(dāng)中應(yīng)用Kafka進(jìn)行業(yè)務(wù)開(kāi)發(fā),需要的朋友可以參考下
    2023-09-09
  • 一篇文章說(shuō)清楚?go?get?使用私有庫(kù)的方法

    一篇文章說(shuō)清楚?go?get?使用私有庫(kù)的方法

    這篇文章主要介紹了go?get?如何使用私有庫(kù),本文會(huì)明確指出Git?、golang的配置項(xiàng),附送TortoiseGit?+?Git混合配置,需要的朋友可以參考下
    2022-09-09
  • Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究

    Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究

    這篇文章主要介紹了Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go1.18都出泛型了速來(lái)圍觀

    Go1.18都出泛型了速來(lái)圍觀

    泛型允許程序員在強(qiáng)類(lèi)型程序設(shè)計(jì)語(yǔ)言中編寫(xiě)代碼時(shí)使用一些以后才指定的類(lèi)型,在實(shí)例化時(shí)作為參數(shù)指明這些類(lèi)型,本文通過(guò)例子給大家介紹下如何使用泛型,對(duì)Go1.18泛型相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-03-03
  • 一文帶你探索Go語(yǔ)言中的函數(shù)一等公民

    一文帶你探索Go語(yǔ)言中的函數(shù)一等公民

    你是否聽(tīng)說(shuō)過(guò)?Go?語(yǔ)言中的函數(shù)是一等公民,如果沒(méi)有,那么恭喜你,本文將帶你一起揭開(kāi)這個(gè)神秘的面紗,感興趣的小伙伴快來(lái)和小編一起學(xué)習(xí)起來(lái)吧
    2023-07-07
  • Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    反射的本質(zhì)就是在程序運(yùn)行的時(shí)候,獲取對(duì)象的類(lèi)型信息和內(nèi)存結(jié)語(yǔ)構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下
    2022-06-06
  • go程序測(cè)試CPU占用率統(tǒng)計(jì)ps?vs?top兩種不同方式對(duì)比

    go程序測(cè)試CPU占用率統(tǒng)計(jì)ps?vs?top兩種不同方式對(duì)比

    這篇文章主要為大家介紹了go程序測(cè)試CPU占用率統(tǒng)計(jì)ps?vs?top兩種不同方式對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳細(xì)介紹Go語(yǔ)言之?dāng)?shù)組與切片

    詳細(xì)介紹Go語(yǔ)言之?dāng)?shù)組與切片

    這篇文章介紹Go語(yǔ)言之?dāng)?shù)組與切片,數(shù)組是具有相同唯一類(lèi)型的一組已編號(hào)且長(zhǎng)度固定的數(shù)據(jù)項(xiàng)序列,這種類(lèi)型可是任意的原始類(lèi)型如整形、字符串或自定義類(lèi)型。切片是數(shù)組的一個(gè)引用,因此切片是引用類(lèi)型,在進(jìn)行傳遞時(shí),遵守引用傳遞的機(jī)制,下面我們就來(lái)詳細(xì)了解一下該內(nèi)容
    2021-10-10
  • xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作

    xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作

    這篇文章主要介紹了xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Skywalking-go自動(dòng)監(jiān)控增強(qiáng)使用探究

    Skywalking-go自動(dòng)監(jiān)控增強(qiáng)使用探究

    這篇文章主要介紹了Skywalking-go自動(dòng)監(jiān)控增強(qiáng)使用深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評(píng)論