ホームページ  >  記事  >  バックエンド開発  >  golang は so メソッドを使用します

golang は so メソッドを使用します

WBOY
WBOYオリジナル
2023-05-10 09:26:062451ブラウズ

Golang (Go とも呼ばれる) は、主にネットワーク アプリケーションや分散システム向けに Google によって開発されたプログラミング言語です。効率的なメモリ管理と優れた同時実行パフォーマンスという利点があるため、ますます多くの開発者に好まれています。 Golang では、so ファイルを使用して C などの言語でライブラリ関数を実装できるため、Golang プログラミングが改善され、コードの再利用性と柔軟性が向上します。この記事では、Golang での so メソッドの使用方法を実際の事例に基づいて説明します。

1. so ファイルとは何ですか?

so ファイル、正式名は Shared Object File (Shared Object File) で、Dynamic Linking Library (Dynamic Linking Library) とも呼ばれます。 reusable ターゲット ファイルを見つけます。このファイルは、さまざまなプログラムで共有して呼び出すことができます。 Linuxシステムにおいてダイナミックリンクライブラリは重要なコンポーネントであり、各種システムライブラリやアプリケーションをsoファイルの形式で提供できるため、アプリケーションの開発や保守が容易になります。 C 言語では、gcc コマンドを使用して .c ファイルを .so ファイルにコンパイルし、それをアプリケーションにリンクして使用できます。 Golang では、cgo メソッドを使用して、呼び出し用に .so ファイルをプログラムにリンクすることもできます。

2. Golang で so ファイルを使用する例

以下では、so ファイルを使用した Golang の md5 計算を例として取り上げます。具体的な手順は次のとおりです:

  1. C 言語コードを作成し、.so ファイルを生成します

最初に md5 値を計算するために md5.c ファイルを作成します:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

char* md5(char* str){
    MD5_CTX md5;
    MD5_Init(&md5);
    MD5_Update(&md5, str, strlen(str));
    unsigned char md[16];
    MD5_Final(md, &md5);

    char* result = (char*)malloc(sizeof(char) * 33);
    memset(result, '', sizeof(result));
    int i = 0;
    for(i = 0; i < 16; i++){
        sprintf(result + i * 2, "%02x", md[i]);
    }

    return result;
}

この C 言語コードでは、OpenSSL を使用します。 md5 値を計算するためのライブラリ内の MD5 アルゴリズム。 Golang は C 言語を呼び出すために cgo メソッドを使用する必要があるため、C 言語の前に「// #include "、ここで、"C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\include" は、MinGW コンパイラの OpenSSL ライブラリのヘッダーです。ファイルパス。

次に、gcc コマンドを使用して md5.c を .so ファイルにコンパイルします。

gcc -shared -o libmd5.so md5.c -fPIC -I /usr/local/opt/openssl/include -L /usr/local/opt/openssl/lib -lcrypto

上記のコマンドでは、

  • -shared は生成することを指定します。共有オブジェクト ファイル;
  • -o は出力ダイナミック リンク ライブラリ ファイル名を指定します;
  • md5.c はソース コード ファイルです;
  • -fPIC は生成されたコードスニペットの位置は無関係であり、複数のアプリケーション間で共有できます。
  • -I /usr/local/opt/openssl/include および -L /usr/local/opt/openssl/lib は OpenSSL へのパスを指定しますライブラリ ファイル;
  • -lcrypto は、リンク暗号化ライブラリ ファイルを指定します。
  1. Golang コードの記述

次に、.so ファイル内の md5 関数を呼び出す main.go ファイルを記述します。具体的なコードは次のとおりです。 :

package main

/*
#cgo LDFLAGS: -L./ -lmd5
#include <stdlib.h>

//引入C语言中的md5函数
char* md5(char* str);

//封装C语言函数,以便在Go中使用
char* c_md5(char* str){
    return md5(str);
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    str := "hello world"
    cstr := C.CString(str)
    defer C.free(unsafe.Pointer(cstr))

    md5 := C.GoString(C.c_md5(cstr))
    fmt.Println(md5)
}

この Golang コードでは、cgo メソッドを使用して C 言語の md5 関数を Golang コードにリンクし、Go 言語を通じて C 言語の md5 関数を呼び出して文字列の md5 値を計算します。 。最初にコメント「// #cgo LDFLAGS: -L./ -lmd5」を使用して .so ファイルのパスと名前を指定し、Go 言語がコンパイル中に .so ファイルを正しくリンクできるようにしたことに注意してください。 ;

2 番目に、「//C 言語で md5 関数を導入する」と「//Go で使用するために C 言語関数をカプセル化する」という 2 つのコメントを通じて、Go 言語で C 言語を宣言します。 、C 言語関数 c_md5 をカプセル化し、Go 言語で C 言語関数を簡単に呼び出せるようにします;

最後に、 C.CString() 関数を通じて文字を C 文字列に変換し、C を使用します。最後に GoString() を使用して、C 文字列を Go 言語の文字列型に変換します。メモリ リークを避けるために、C.CString() 関数を使用して文字列を C 言語文字に変換した後、C.free() 関数を手動で呼び出してメモリを解放する必要があることにも注意してください。

3. 概要

この単純なケースを通じて、Golang の so メソッドを使用して、C 言語ライブラリ ファイルをリンクすることでプログラミングの効率を向上させる方法を学びました。 so ファイルを使用する場合、各ファイルのパス、コンパイラとライブラリのバージョンに注意する必要があることに注意してください。特に Mac OS システムでは、バージョンやサポートの問題が発生する可能性があるため、実際のアプリケーションではいくつかの問題が発生します。そして問題点。しかし、開発者全員の協力により、これらの問題は段階的に解決され、Golang の開発効率はますます高くなるものと信じています。

以上がgolang は so メソッドを使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。