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

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

В качестве значения директива принимает строку с флагами компилятора. Она может быть использована как для всех файлов пакета, так и для конкретных файлов с помощью специального синтаксиса.

Синтаксис

go//go:cgo CFLAGS: -I/path/to/include -O2

Директива пишется в комментарии перед объявлением пакета. После ключевого слова CFLAGS через двоеточие указываются флаги, которые будут переданы компилятору C.

Пример

Давайте добавим путь к заголовочным файлам и включим оптимизацию:

gopackage main

/*
#cgo CFLAGS: -I./include -O3
#include "mylib.h"
*/
import "C"
import "fmt"

func main() {
  res := C.hello()
  fmt.Println(res)
}

Результат выполнения кода (если функция возвращает строку):

go"Hello from C"

Пример

Укажем несколько флагов одновременно, включая предупреждения:

gopackage main

/*
#cgo CFLAGS: -Wall -Wextra -pedantic -std=c99
#include <stdio.h>
*/
import "C"
import "fmt"

func main() {
  C.printf(C.CString("Hello from C with flags\n"))
  fmt.Println("Done")
}

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

go"Hello from C with flags"
"Done"

Пример

Используем условную директиву для разных операционных систем:

gopackage main

/*
#cgo windows CFLAGS: -D_WIN32
#cgo linux CFLAGS: -D_LINUX
#include <stdio.h>
*/
import "C"
import "fmt"

func main() {
  fmt.Println("Compiled with OS-specific flags")
}

Результат выполнения кода (зависит от ОС):

go"Compiled with OS-specific flags"

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

  • директиву #cgo LDFLAGS,
    которая задает флаги для линковщика
  • директиву #cgo pkg-config,
    которая используется для интеграции с pkg-config
  • особенности работы с указателями в cgo,
    важные для безопасной работы с памятью
  • раздел про горутины и cgo,
    описывающий взаимодействие с потоками