最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang 調用c語言動態(tài)庫方式實現

 更新時間:2021年12月31日 10:47:04   作者:小_村長  
本文主要介紹了golang 調用c語言動態(tài)庫方式實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

1.實現頭文件,聲明文件中函數。這里創(chuàng)建一個add.h文件。

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

2.實現add主體函數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.用命令生成動態(tài)庫,在linux下文件名稱是libadd.so

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

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

4.編寫一個庫來測試一下

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

鏈接動態(tài)庫生成可執(zhí)行文件

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

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

錯誤:運行出錯的情況

# 運行 ./test,出錯
./test: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

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

$ LD_LIBRARY_PATH=lib/ ./test
giter8

至此,動態(tài)庫 libadd.so 準備好了,并且用 test 驗證了它是可用的,接下來就在 Go 語言中使用該動態(tài)庫的函數。

5.golang調用c動態(tài)庫

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

main.go 的代碼如下:

package main

/*
// 頭文件的位置,相對于源文件是當前目錄,所以是 .,頭文件在多個目錄時寫多個  #cgo CFLAGS: ...
#cgo CFLAGS: -I./include
// 從哪里加載動態(tài)庫,位置與文件名,-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))
}

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

./demo1
run c:  go2021

成功調用 C 實現的 add 函數
下面列出一些問題
import "C" 要緊挨著 /*...*/ 注釋塊,如果寫成

/*
#cgo ...
*/

import "C"

出現下面的報錯信息

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

import "C" 要獨占一行, 試圖同時引入其他的庫,如 import ("C"; "fmt") 也會報上面同樣的錯誤
加載不到頭文件的錯誤很明顯,#include "add.h" 時會告訴你該文件不存在,如果沒有加載到正確的頭文件調用 C.Add() 函數時就會報錯

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

還有一個關鍵是能否加載到動態(tài)庫 libadd.so, 參考了網上一些例子,如果把第五行改為

cgo LDFLAGS: -L./lib -ladd

編譯不會報錯,執(zhí)行時會出錯。

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

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

LD_LIBRARY_PATH=lib/ ./demo1

到此這篇關于golang 調用c語言動態(tài)庫方式實現的文章就介紹到這了,更多相關golang 調用c語言動態(tài)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go 代碼生成工具詳解

    Go 代碼生成工具詳解

    這篇文章主要介紹了Go 代碼生成工具詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 解決golang讀取http的body時遇到的坑

    解決golang讀取http的body時遇到的坑

    這篇文章主要介紹了解決golang讀取http的body時遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go的固定時長定時器和周期性時長定時器

    Go的固定時長定時器和周期性時長定時器

    本文主要介紹了Go的固定時長定時器和周期性時長定時器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 一文帶你學會使用Go語言實現自己的MCP服務端

    一文帶你學會使用Go語言實現自己的MCP服務端

    這篇文章將帶大家速覽MCP的核心概念,并以Go語言為例,介紹如何開發(fā)MCP服務端和客戶端,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2025-04-04
  • Golang 讀取并解析SQL文件的實現方法

    Golang 讀取并解析SQL文件的實現方法

    本文介紹了如何使用Go語言編寫一個簡單的函數,用于讀取并解析SQL文件,通過一個函數,我們可以輕松地將SQL文件中的語句提取出來,進行后續(xù)的操作,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Systemd集成Golang二進制程序的方法

    Systemd集成Golang二進制程序的方法

    這篇文章主要介紹了Systemd集成Golang二進制程序的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • 詳解Golang中的各種時間操作

    詳解Golang中的各種時間操作

    這篇文章主要介紹了詳解Golang中的各種時間操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • golang協(xié)程池模擬實現群發(fā)郵件功能

    golang協(xié)程池模擬實現群發(fā)郵件功能

    這篇文章主要介紹了golang協(xié)程池模擬實現群發(fā)郵件功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 一文帶你深入理解Golang Context包

    一文帶你深入理解Golang Context包

    在 Go 語言中,Context 包是一種非常常用的工具,它被用來管理 goroutine 之間的通信和取消。本文將深入探討Context 包的基本原理,包括使用場景、原理和一些最佳實踐,需要的可以參考下
    2023-05-05
  • Go使用pprof進行CPU,內存和阻塞情況分析

    Go使用pprof進行CPU,內存和阻塞情況分析

    Go 語言提供了強大的 pprof工具,用于分析 CPU、內存、Goroutine 阻塞等性能問題,幫助開發(fā)者優(yōu)化程序,提高運行效率,下面我們就來深入了解下pprof 的使用吧
    2025-03-03

最新評論

靖安县| 水城县| 镇坪县| 枣强县| 郧西县| 台安县| 岳阳市| 莒南县| 无为县| 射洪县| 凌海市| 永新县| 义马市| 荆门市| 福安市| 青神县| 印江| 辽阳县| 运城市| 乌拉特前旗| 永川市| 霍邱县| 临洮县| 奇台县| 施甸县| 醴陵市| 永济市| 独山县| 韶关市| 金平| 灵川县| 天门市| 宜川县| 大田县| 南江县| 珲春市| 论坛| 玉田县| 定日县| 珠海市| 滦平县|