Директива #cgo CFLAGS
Директива #cgo CFLAGS используется в файлах Go с пакетом, использующим cgo,
для указания дополнительных флагов компилятору C. Эти флаги передаются компилятору
при обработке C-кода, который находится в том же пакете. Директива позволяет
настроить параметры компиляции, такие как уровень оптимизации, путь к заголовочным
файлам и другие опции.
В качестве значения директива принимает строку с флагами компилятора. Она может быть использована как для всех файлов пакета, так и для конкретных файлов с помощью специального синтаксиса.
Синтаксис
//go:cgo CFLAGS: -I/path/to/include -O2
Директива пишется в комментарии перед объявлением пакета.
После ключевого слова CFLAGS через двоеточие указываются флаги,
которые будут переданы компилятору C.
Пример
Давайте добавим путь к заголовочным файлам и включим оптимизацию:
package main
/*
#cgo CFLAGS: -I./include -O3
#include "mylib.h"
*/
import "C"
import "fmt"
func main() {
res := C.hello()
fmt.Println(res)
}
Результат выполнения кода (если функция возвращает строку):
"Hello from C"
Пример
Укажем несколько флагов одновременно, включая предупреждения:
package 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")
}
Результат выполнения кода:
"Hello from C with flags"
"Done"
Пример
Используем условную директиву для разных операционных систем:
package 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")
}
Результат выполнения кода (зависит от ОС):
"Compiled with OS-specific flags"
Смотрите также
-
директиву
#cgo LDFLAGS,
которая задает флаги для линковщика -
директиву
#cgo pkg-config,
которая используется для интеграции с pkg-config -
особенности работы с
указателями в cgo,
важные для безопасной работы с памятью -
раздел про
горутины и cgo,
описывающий взаимодействие с потоками