>백엔드 개발 >Golang >Go에서 정적 개체 파일의 함수를 호출하는 방법은 무엇입니까?

Go에서 정적 개체 파일의 함수를 호출하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-03 12:04:291044검색

How to Call Functions in Static Object Files from Go?

Go에서 정적 개체 파일의 함수 호출

Go 내에서 공유 라이브러리(.so) 파일의 함수를 호출하려고 합니다. 이 목적으로 syscall.LoadLibrary를 사용하라는 제안을 받았을 수도 있지만 "정의되지 않음: syscall.LoadLibrary" 오류가 발생했습니다.

그러나 공유 라이브러리를 로드하고 액세스하는 것은 실제로 가능합니다. Go의 기능입니다. POSIX 플랫폼에서 이를 달성하려면 cgo를 활용하고 시스템의 기본 API와 상호작용할 수 있습니다.

다음은 cgo를 사용하는 간단한 데모입니다.

<code class="go">// +build linux darwin
// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>

package main

import (
    "C"
    "fmt"
)

func foo() {
    // Load the shared library
    handle := C.dlopen(C.CString("libfoo.so"), C.RTLD_LAZY)

    // Retrieve the function pointer from the library
    bar := C.dlsym(handle, C.CString("bar"))

    // Print the function pointer address
    fmt.Printf("bar is at %p\n", bar)
}

func main() { foo() }</code>

여기서 예:

  • 빌드 지시문은 컴파일을 Linux 및 Darwin으로 제한합니다. 플랫폼.
  • #cgo LDFLAGS: -ldl은 실행 파일을 동적 링커 라이브러리(libdl)에 링크합니다.
  • #include dlopen 및 dlsym 함수에 필요한 C 헤더를 가져옵니다.
  • foo 함수는 공유 라이브러리를 로드하고 "bar" 함수에 대한 함수 포인터를 검색하고 해당 주소를 인쇄합니다.

정확한 구문과 함수 이름은 기본 시스템과 컴파일러에 따라 다를 수 있습니다. cgo를 활용하고 기본 시스템 API와 상호작용함으로써 Go와 공유 라이브러리 간의 격차를 해소하고 애플리케이션의 기능을 확장할 수 있습니다.

위 내용은 Go에서 정적 개체 파일의 함수를 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.