Директива #cgo LDFLAGS

Директива #cgo LDFLAGS используется в файлах Go для передачи дополнительных параметров линковщику при компиляции C-кода через cgo. Она позволяет подключать внешние C-библиотеки, указывать пути к ним и задавать другие опции компоновщика. В качестве значения передается строка с флагами, которая будет добавлена к команде линковки.

Синтаксис

go// #cgo LDFLAGS: -lm -lz -L/path/to/libs
import "C"

Пример

Давайте подключим математическую библиотеку libm и вызовем функцию pow из C:

gopackage main

/*
#include <math.h>
#cgo LDFLAGS: -lm
*/
import "C"
import "fmt"

func main() {
  x := C.double(2.0)
  y := C.double(3.0)
  res := C.pow(x, y)
  fmt.Printf("%.0f\n", float64(res))
}

Результат выполнения кода:

go"8"

Пример

Подключим библиотеку сжатия zlib с указанием пути для поиска библиотек:

gopackage main

/*
#include <zlib.h>
#cgo LDFLAGS: -lz -L/usr/local/lib
*/
import "C"
import "fmt"

func main() {
  version := C.zlibVersion()
  fmt.Printf("zlib version: %s\n", C.GoString(version))
}

Результат выполнения кода:

go"zlib version: 1.2.11"

Пример

Использование нескольких флагов в одной директиве для статической линковки библиотеки:

gopackage main

/*
#cgo LDFLAGS: -static -lssl -lcrypto -L/usr/lib/x86_64-linux-gnu
#include <openssl/ssl.h>
*/
import "C"
import "fmt"

func main() {
  version := C.SSLeay_version(C.SSLEAY_VERSION)
  fmt.Printf("OpenSSL version: %s\n", C.GoString(version))
}

Результат выполнения кода:

go"OpenSSL version: OpenSSL 1.1.1w  11 Sep 2023"

Смотрите также

  • директиву #cgo CFLAGS,
    которая задает флаги для компилятора C
  • директиву #cgo pkg-config,
    которая использует pkg-config для получения флагов
  • функцию C.CString,
    которая преобразует строку Go в C-строку
  • функцию C.GoString,
    которая преобразует C-строку в строку Go