[Учебное пособие для уровня няни] Единая практика компиляции сервисов Docker на двойной архитектуре (X86 и ARM)
[Учебное пособие для уровня няни] Единая практика компиляции сервисов Docker на двойной архитектуре (X86 и ARM)

В современных компьютерных системах X86 и ARM64 представляют собой две распространенные процессорные архитектуры. Чтобы удовлетворить потребности различных архитектур, образы Docker также должны поддерживать упаковку с двойной архитектурой. В этой статье будет представлена ​​практика унификации упаковки образов Docker с двойной архитектурой.

1. Упаковка образов Docker

В образах Docker это обычно достигается с помощью многоэтапной сборки. На первом этапе создается двоичный файл, соответствующий сервису архитектуры; на втором этапе запускается двоичный файл, соответствующий архитектуре. Ниже приведены два примера файлов Dockerfile на основе Debian, которые используются для создания образов Docker. для архитектуры X86 и архитектуры ARM64:

1.Пример файла Dockerfile для архитектуры X86:

Язык кода:javascript
копировать
FROM debian:latest AS builder

RUN apt-get update && apt-get install -y build-essential

WORKDIR /app

COPY . .

RUN make

FROM debian:latest

WORKDIR /app

COPY --from=builder /app/app /app

CMD ["/app/app/install.sh"]

CMD ["/app/app/build.sh"]

копировать

2.Пример Dockerfile архитектуры ARM64:

Язык кода:javascript
копировать
FROM arm64v8/debian:latest AS builder

RUN apt-get update && apt-get install -y build-essential

WORKDIR /app

COPY . .

RUN make

FROM arm64v8/debian:latest

WORKDIR /app

COPY --from=builder /app/app /app

CMD ["/app/app/install_arm.sh"]

CMD ["/app/app/build_arm.sh"]

копировать

Основное различие между двумя файлами Dockerfile — это выбор базового образа и идентификатора архитектуры в операторе FROM. Файл Dockerfile для архитектуры X86 использует debian:latest в качестве базового образа, а файл Dockerfile для архитектуры ARM64 использует Arm64v8/debian:latest в качестве базового образа. Кроме того, файл Dockerfile для архитектуры ARM64 использует идентификатор Arm64v8 в инструкции FROM для указания архитектуры ARM64. Наконец, сценарии установки, выполняемые CMD, также различаются. Должно быть, для разных сред требуются разные сценарии установки.

Чтобы облегчить развертывание служб Docker в среде с двойной архитектурой, вы можете написать сценарий bash для вызова работы двух вышеупомянутых файлов Dockerfile, выполнив команду docker build. Ниже приведены два примера bash-скриптов:

1.X86 bash-скрипт

Язык кода:javascript
копировать
#!/bin/bash

docker build -t myapp:x86 -f Dockerfile.x86 .

docker manifest create myapp:latest myapp:x86

docker manifest push myapp:latest

копировать

2. Баш-скрипт Arm64

Язык кода:javascript
копировать
#!/bin/bash

docker build -t myapp:arm64 -f Dockerfile.arm64 .

docker manifest create myapp:latest myapp:arm64

docker manifest push myapp:latest

копировать

В этом сценарии bash сначала используйте команду docker build для создания образов Docker для архитектуры X86 и архитектуры ARM64 соответственно и пометьте их myapp:x86 и myapp:arm64 соответственно. Затем используйте команду Docker Manifest Create, чтобы создать файл манифеста с именем myapp:latest и добавьте теги myapp:x86 и myapp:arm64 в файл манифеста. Наконец, используйте команду docker манифест push, чтобы отправить файл манифеста в Docker Hub, чтобы тег myapp:latest можно было использовать для получения образа Docker в компьютерных системах с различной архитектурой.

Конкретный процесс примерно следующий:

2. Унифицированная мультиархитектурная упаковка образа Docker.

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

1. Объедините скрипт build_docker.sh

Первый — скомпилировать сценарий запуска build_docker.sh для образа. Причина, по которой здесь используются два сценария, заключается в том, что необходимо выполнять разные файлы docker. Фактически, вы можете динамически принимать решение о выполнении разных файлов dockers, передавая параметры, такие как. следующий пример:

Язык кода:javascript
копировать
#!/bin/bash

# Получить входящие параметры из Архитектуры
ARCH=$1

# Создавайте разные файлы Dockerfile в соответствии с разными параметрами архитектуры.
case $ARCH in
  "x86_64")
    DOCKERFILE="Dockerfile.x86_64"
    ;;
  "armv7l")
    DOCKERFILE="Dockerfile.armv7l"
    ;;
  "aarch64")
    DOCKERFILE="Dockerfile.aarch64"
    ;;
  *)
    echo "Unsupported architecture: $ARCH"
    exit 1
    ;;
esac

# Создание Докерзеркало
docker build -t myimage:$ARCH -f $DOCKERFILE .

копировать

Конечно, если у самого бизнеса уже есть много параметров, вы также можете использовать псевдоним opt, чтобы избежать путаницы и обеспечить согласованность на уровне команд, например:

Язык кода:javascript
копировать
#!/bin/bash

# Архитектура по умолчанию — x86_64.
ARCH="x86_64"

# Обработка аргументов командной строки
while getopts "a:" opt; do
  case $opt in
    a)
      ARCH=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

# Создавайте разные файлы Dockerfile в соответствии с разными параметрами архитектуры.
case $ARCH in
  "x86_64")
    DOCKERFILE="Dockerfile.x86_64"
    ;;
  "armv7l")
    DOCKERFILE="Dockerfile.armv7l"
    ;;
  "aarch64")
    DOCKERFILE="Dockerfile.aarch64"
    ;;
  *)
    echo "Unsupported architecture: $ARCH"
    exit 1
    ;;
esac

# Создание Докерзеркало
docker build -t myimage:$ARCH -f $DOCKERFILE .

копировать

Здесь есть изящный момент: если опция -a не указана,По умолчанию — архитектура x86_64.,Удобная совместимость с существующими скриптами.。Если переданоиз Архитектура Параметр не поддерживается,Скрипт выведет сообщение об ошибке и завершит работу.

Конечно, бизнес-потребность может заключаться в одновременной компиляции нескольких архитектур, тогда этот скрипт необходимо обновить:

Язык кода:javascript
копировать
#!/bin/bash

# Архитектура по умолчанию — x86_64.
ARCHS=("x86_64")

# Обработка аргументов командной строки
while getopts "a:" opt; do
  case $opt in
    a)
      ARCHS+=("$OPTARG")
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

# Если имеется более двух параметров внешней архитектуры, одновременно создается несколько Dockerзеркало.
if [ ${#ARCHS[@]} -ge 2 ]; then
  # Создание Докерзеркало
  docker buildx build --platform "${ARCHS[@]/#/--platform }" -t myimage .
else
  # только один Архитектурапараметр,тогда как раньшеиз Способ Создание Докерзеркало
  ARCH=${ARCHS[0]}
  # Создавайте разные файлы Dockerfile в соответствии с разными параметрами архитектуры.
  case $ARCH in
    "x86_64")
      DOCKERFILE="Dockerfile.x86_64"
      ;;
    "armv7l")
      DOCKERFILE="Dockerfile.armv7l"
      ;;
    "aarch64")
      DOCKERFILE="Dockerfile.aarch64"
      ;;
    *)
      echo "Unsupported architecture: $ARCH"
      exit 1
      ;;
  esac

  # Создание Докерзеркало
  docker build -t myimage:$ARCH -f $DOCKERFILE .
fi

копировать

Это предполагает использование --platform и соответствующий файл докеров:

Язык кода:javascript
копировать
FROM --platform=$BUILDPLATFORM golang:1.14 as builder

копировать

На самом деле, есть и другие команды dockerfile, которые можно использовать.

Переменные, связанные с архитектурой

Dockerfile Поддерживает следующие переменные, связанные с архитектурой

TARGETPLATFORM

Целевая платформа для построения образа, например linux/amd64, linux/arm/v7, windows/amd64

TARGETOS

TARGETPLATFORM из OS тип, например linux, windows

TARGETARCH

TARGETPLATFORM из Архитектуратип, например amd64, arm

TARGETVARIANT

TARGETPLATFORM в варианте эта переменная может быть пустой, например v7

BUILDPLATFORM

Создайте зеркальную хост-платформу, например linux/amd64

BUILDOS

BUILDPLATFORM из OS тип, например linux

BUILDARCH

BUILDPLATFORM из Архитектуратип, например amd64

BUILDVARIANT

BUILDPLATFORM в варианте эта переменная может быть пустой, например v7

Затем с помощью этих трех методов скрипт build_docker.sh унифицирован.

Прямо сейчас

2. Объедините файлы dockerfile.

Прямо сейчас,В основном решена проблема слияния и унификации build_docker.shиз,Теперь нам все еще нужно решить проблему согласованности файлов док-файлов.

существовать Прямо сейчасизbuild_dockerиспользуется в скриптах

docker buildили

docker buildx build --platformиззапуск командыdockerfileдокумент

Здесь файл dockerfile необходимо упаковать в соответствии с различной архитектурой.,Содержание другое,Поэтому я написал два файла dockerfile.x86иdockerfile.arm.

Если вы можете передать информацию об архитектуре в файл docker, вы можете объединить два файла в один.

Основными командами выполнения здесь являются:

Язык кода:javascript
копировать
docker build --build-arg ARCH=x86_64 -t myimage:x86_64 .

копировать

Соответствующий файл dockerfile:

Язык кода:javascript
копировать
# Параметры сборки
ARG ARCH

# В зависимости от архитектуры выберите другую основу зеркала.
FROM ${ARCH}/debian:latest

# Установите необходимые пакеты
RUN apt-get update && apt-get install -y gcc g++ make && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY . .

RUN make

FROM ${ARCH}/debian:latest

WORKDIR /app 

COPY --from=builder /app/app /app 

CMD ["/app/app/install.sh"]

CMD ["/app/app/build.sh"]

копировать

Конечно, это всего лишь образец. На самом деле, помимо FROM, здесь нужно выбрать еще несколько скриптов установки.

Измените приведенный выше скрипт следующим образом:

Язык кода:javascript
копировать
# Параметры сборки
ARG ARCH

# В зависимости от архитектуры выберите другую основу зеркала.
FROM ${ARCH}/debian:latest

# Установите необходимые пакеты
RUN apt-get update && apt-get install -y gcc g++ make && rm -rf /var/lib/apt/lists/*

# копировать исходный код приложения
COPY app /app

# В зависимости от архитектуры выберите другой каталог приложений.
RUN if [ "$ARCH" = "x86_64" ]; then \
        cp -r /app/install_x86.sh /app/install.sh; \
    elif [ "$ARCH" = "arm64v8" ]; then \
        cp -r /app/install_arm.sh /app/install.sh; \
    else \
        echo "Unsupported architecture: $ARCH"; \
        exit 1; \
    fi

# Запустите установщик
CMD ["/app/install.sh"]

копировать

С помощью описанного выше метода в основном реализуется файл dockerfile.

Тогда ситуация становится такой:

На шаг ближе к успеху

3. Объедините сценарий зависимости установки (install.sh)

Как и выше, измените его, передав переменные

Язык кода:javascript
копировать
#!/bin/bash

# Параметры сборки
ARCH=$1

# Установите различные зависимости среды
if [ "$ARCH" = "x86_64" ]; then
    apt-get update && apt-get install -y gcc g++ make
elif [ "$ARCH" = "arm64v8" ]; then
    apt-get update && apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu make
else
    echo "Unsupported architecture: $ARCH"
    exit 1
fi

# Скачать и скомпилировать программу golang
wget https://example.com/myapp.tar.gz
tar -xzf myapp.tar.gz
cd myapp
GOOS=linux GOARCH=$ARCH go build -o myapp

# Запустить программу Голанг
./myapp

копировать

конечно,Вообще говоря, установка зависимостей немного сложнее.,Некоторые проблемы, связанные с версиями ARM и не ARM.,Да, это номер версии для обновления и понижения версии.,В дополнение к ifelse выше,Вы также можете использовать команду sed –i для персонализированных изменений.,Например, сценарий установки такой:

Язык кода:javascript
копировать
#!/bin/bash

# Установите зависимости среды архитектуры x86.
apt-get update && apt-get install -y gcc g++ make libssl-dev

# Скачать и скомпилировать программу golang
wget https://example.com/myapp.tar.gz
tar -xzf myapp.tar.gz
cd myapp
GOOS=linux GOARCH=amd64 go build -o myapp

# Запустить программу Голанг
./myapp

копировать

Сценарий внешнего звонка можно настроить следующим образом.

Язык кода:javascript
копировать
#!/bin/bash

# Измените зависимости среды в install.sh.
sed -i 's/apt-get install -y gcc g++ make libssl-dev/apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu make libssl-dev/g' install.sh

# Вызов сценария установки
./install.sh

копировать

Конечно, сед -i - более гибкий и эффективный метод модификации.,Нужно обратить внимание на ремонтопригодность,в противном случае,Возможно, потребуется изменить сценарий.,Приводит к тому, что несколько скриптов становятся недоступными.

конечно,см. здесь,Может быть вопрос,Можно ли использовать метод sed -iiz для адаптации dockerfile к множеству архитектур?,Вместо передачи параметров с помощью ARGиз?

Здесь автор также сравнивает различия между ними.

наконец,Здесь предлагается хранить базовые зависимости установки отдельно как базовое зеркало.,Это позволяет избежать дублирования в нескольких предприятиях.

Это происходит примерно так:

3. Мультиархитектурная компиляция Golang

1.Мультисистемная и мультиархитектурная компиляция Golang

В Голанге,Мы можем добиться создания нескольких архитектур с разными суффиксами файлов. Это связано с тем, что инструмент компилирования Golang может определить тип требуемой компиляции архитектуры на основе суффикса файла. первый,Давайте посмотрим на значение различных суффиксов файлов. В Голанге,Суффиксы файлов обычно состоят из двух частей.,Это Операционная система (GOOS) и Архитектура (GOARCH). Например,Имя файла — «hello_windows_amd64.exe».,«Windows» означает, что установлена ​​операционная система Windows.,«amd64» означает «Архитектура» для 64-битной архитектуры изx86.

Вот базовый пример Голанга:

Язык кода:javascript
копировать
package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

копировать

В операционной системе Linux вы можете использовать следующую команду для компиляции программы:

Язык кода:javascript
копировать
$ go build -o hello_windows_amd64.exe

копировать

В архитектуре процессора ARM для компиляции программы можно использовать следующую команду:

Язык кода:javascript
копировать
go build -o hello_linux_amd64

копировать

Этот метод обычно используется во многих адаптациях ARMизXinchuang.

В качестве примера возьмем более распространенную библиотеку журналов на github:

Эта ошибка произошла во время адаптации

Поскольку используется метод Dup2, сообщается об ошибке.,dup2 — это своего рода команда дублирования,Еще есть команда dupиdup3,Различия между этими тремя заключаются в следующем

dup(int filedes)Функция возвращает доступныйизиfiledesобщийдокументзапись в таблицеизминимальный дескриптор

dup2(int filedes,int filedes2)заключается в использовании дескриптораfiledes2указыватьfiledesдокументзапись в таблице(Также опубликовано)

dup3(int oldfd, int newfd, int flags)иdup2сходство,Разница в том,,Вы можете принудительно установить новый файловый дескриптор, указав флаги для O_CLOEXEC из логотипа close-on-exec.

фактически,Помимо функциональных различий, три метода,Есть также некоторые различия в адаптации платформы:

Darwin(MacOS)изX86Архитектураподдерживать: Dup2

Архитектура LinuxизX86 поддерживает:    Dup2、Dup3

Архитектура Linux isarm поддерживает: Dup3

Поэтому при адаптации,Соответствующая реализация метода может быть определена отдельно в зависимости от компилируемых платформ и файлов.,например:

2.Мультисистемная и мультиархитектурная компиляция CGo

CGO — это инструмент на языке Go для взаимодействия с языком C.,Это позволяет нам вызывать функции языка C и использовать библиотеки языка C на языке Go. Пока занимаюсь CGO компилировать,Нам необходимо рассмотреть проблему множества систем и множества архитектур.,Чтобы гарантировать, что наша программа может нормально работать в различных операционных системах и архитектурах.

Вот некоторые методы мультисистемной мультиархитектуракомпилизации CGO:

2.1 Используйте переменную среды CGO_ENABLED

Используйте переменную среды CGO_ENABLED. Переменную среды CGO_ENABLED можно использовать для управления включением CGO. При выполнении мультисистемной мульти-Архитектуракомпилировать,Мы можем установить переменную среды CGO_ENABLED на 0.,Это отключит CGO,Это позволяет избежать проблем в различных операционных системах и архитектурах.

Ниже приведен конкретный пример,Предположим, нам нужно скомпилировать программу Go, использующую библиотеку libcurl.,ии нужносуществоватьLinuxиWindowsоперационная система соответственнокомпилироватьвнеx86иx64 Архитектура программы。Мы можем сделать это, используя следующую командукомпилировать:

Язык кода:javascript
копировать
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o myprogram-linux-amd64 main.go 
CGO_ENABLED=1 GOOS=linux GOARCH=386 go build -o myprogram-linux-386 main.go 
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -o myprogram-windows-amd64.exe main.go 
CGO_ENABLED=1 GOOS=windows GOARCH=386 go build -o myprogram-windows-386.exe main.go

копировать

Эта команда отделиткомпилироватьвнеLinuxиWindowsв операционной системеизx86иx64 Архитектура программы

2.2 Используйте инструменты кросс-компиляции

Используйте инструмент кросс-компиляции. Инструмент кросс-компиляции позволяет нам создавать несколько программ для разных операционных систем на одной машине. Пока занимаюсь CGO компилировать,Мы можем использовать инструмент кросс-компиляции для компиляции программ для нескольких разных операционных систем.,Это гарантирует, что наши программы смогут нормально работать в различных операционных системах.

Ниже приведен подробный пример перекрестной компиляции iscgo.,Предположим, нам нужно скомпилировать программу Go, использующую библиотеку libcurl.,ии нужносуществоватьLinuxиWindowsоперационная система соответственнокомпилироватьвнеx86иx64 Архитектура программы。

Установите инструменты кросс-компиляции. Сначала нам нужно установить инструменты кросс-компиляции. В системе Ubuntu мы можем использовать следующую команду для установки инструмента кросс-компиляции:

Язык кода:javascript
копировать
sudo apt-get install gcc-arm-linux-gnueabihf
sudo apt-get install gcc-mingw-w64-x86-64

копировать

 Эта команда установит инструменты кросс-компиляции Arm-linux-gnueabihf и mingw-w64-x86-64 для компиляции ARM и Windows соответственно. x64 Архитектура программы。

Описание программ на Go Далее нам нужно написать программу на Go, использующую библиотеку libcurl. Предположим, что наш программный код выглядит следующим образом:

Язык кода:javascript
копировать
package main

// #cgo LDFLAGS: -lcurl
// #include <curl/curl.h>
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    curl := C.curl_easy_init()
    if curl == nil {
        fmt.Println("Failed to initialize curl")
        return
    }
    defer C.curl_easy_cleanup(curl)

    url := C.CString("https://www.example.com")
    defer C.free(unsafe.Pointer(url))

    C.curl_easy_setopt(curl, C.CURLOPT_URL, url)

    res := C.curl_easy_perform(curl)
    if res != C.CURLE_OK {
        fmt.Println("Failed to perform curl request")
        return
    }

    fmt.Println("Curl request succeeded")
}

копировать

Эта программа использует библиотеку libcurl для отправки HTTP-запросов. Ключевое слово CGO LDFLAGS используется для связывания библиотеки libcurl, а заголовочный файл языка C используется для вызова функции библиотеки libcurl.

скомпилировать программу ARM Архитектура Далее нам понадобится скомпилировать программу ARM Архитектура. Мы можем использовать следующую команду для компиляции программы ARM Архитектура:

Язык кода:javascript
копировать
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnueabihf-gcc go build -o myprogram-arm main.go

копировать

Эта команда будет использовать инструмент кросс-компиляции Arm-linux-gnueabihf-gcc для компиляции программы ARM Архитектура.,И используйте ключевое слово CGO LDFLAGS, чтобы связать библиотеку libcurl. в,GOOS=linux означает компилировать операционную систему Linux из программы.,GOARCH=armвыражатькомпилироватьARMАрхитектураизпрограмма,GOARM=7выражатькомпилироватьARMv7Архитектураизпрограмма。

Компилировать Windows x64 Архитектура программы Наконец, нам нужно Компилировать Windows x64 Архитектура программа. Мы можем использовать следующую команду для компилирования Windows x64 Архитектура программы:

Язык кода:javascript
копировать
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build -o myprogram-windows.exe main.go

копировать

 Эта команда будет использовать инструмент кросс-компиляции x86_64-w64-mingw32-gcc для компилирования. Windows x64 Архитектура программы,и Используйте CGO Ключевое слово LDFLAGS для связи с библиотекой libcurl. Среди них GOOS=windows означает Компилировать WindowsОперационная системаизпрограмма,GOARCH=amd64выражатькомпилироватьx64 Архитектура программы。

Вот еще один лучший пример:

Как использовать docker buildx для создания кроссплатформенного образа Go

2.3. Используйте такие ключевые слова, как CGO LDFLAGS.

Используйте CGO Ключевые слова, такие как ЛДФЛАГС. При компиляции CGO мы можем использовать CGO Ключевые слова, такие как LDFLAGS.Для указания ссылки необходимаиз Библиотекаикомпилировать Параметры。Эти ключевые слова позволяют намсуществоватьдругойиз Операционная системаи Архитектураиспользуется в разныхиз Связь Библиотекаикомпилировать Параметры,Это гарантирует, что наши программы смогут нормально работать в различных операционных системах.

Директива #cgo — это ключевое слово, используемое для вызова функций и библиотек языка C на языке Go. Это позволяет нам использовать язык C из функций и библиотеки на языке Go.,Тем самым расширяя функциональность языка Go. При выполнении cgo multi Архитектуракомпилировать,Мы можем использовать директиву #cgo, чтобы указать параметры компиляции в разных операционных системах.

Вот некоторые директивы #cgo, используемые в многоцелевой архитектуре cgo:

#cgo CFLAGS #cgo Директива CFLAGS может использоваться для указания параметров компиляции изкомпилировать язык C. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Директива CFLAGS для указания опций компилирования под разные операционные системы. Например, мы можем использовать следующую директиву, чтобы указать опцию компилировать ARM Архитектура:

Язык кода:javascript
копировать
#cgo CFLAGS: -march=armv7-a -mfpu=neon

копировать

Эта директива скомпилирует код языка C с использованием параметров компиляции -march=armv7-a и -mfpu=neon в рамках архитектуры ARM.

#cgo LDFLAGS #cgo Директива LDFLAGS может использоваться для указания параметров компоновщика. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Директива LDFLAGS для указания параметров ссылки в разных операционных системах и архитектурах. Например, мы можем использовать следующую директиву, чтобы указать Windows Варианты ссылок x64 Архитектура:

Язык кода:javascript
копировать
#cgo LDFLAGS: -L/usr/local/lib -lcurl

копировать

Эта директива свяжет библиотеку libcurl с использованием параметров ссылки -L/usr/local/lib и -lcurl в архитектуре Windows x64.

#cgo windows #cgo Команду Windows можно использовать для указания параметров компиляции в операционной системе Windows. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Команда Windows для указания параметров компилирования в разных операционных системах. Например, мы можем использовать следующую команду, чтобы указать опцию «изкомпилировать» в операционной системе Windows:

Язык кода:javascript
копировать
#cgo windows CFLAGS: -D_WIN32_WINNT=0x0601

копировать

Эта инструкция будет использовать параметр компиляции -D_WIN32_WINNT=0x0601 для компиляции кода языка C в операционной системе Windows.

#cgo linux

#cgo Команду Windows можно использовать для указания параметров компиляции в операционной системе Linux. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Команда Linux для указания параметров компилирования в разных операционных системах. Например, мы можем использовать следующую команду, чтобы указать опцию «изкомпилировать» в операционной системе Linux:

Язык кода:javascript
копировать
#cgo linux CFLAGS: -D_GNU_SOURCE

копировать

Эта директива будет использовать параметр компиляции -D_GNU_SOURCE для компиляции кода языка C в операционной системе Linux.

#cgo darwin #cgo Команду darwin можно использовать для указания опции компилировать в операционной системе macOS. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Директива darwin для указания опций компилирования под разные операционные системы. Например, мы можем использовать следующую команду, чтобы указать опцию «изкомпилировать» в операционной системе macOS:

Язык кода:javascript
копировать
#cgo darwin CFLAGS: -mmacosx-version-min=10.10

копировать

Эта директива будет использовать параметр компиляции -mmacosx-version-min=10.10 для компиляции кода языка C в операционной системе macOS.

#cgo linux,arm64 и #cgo linux,amd64

Язык кода:javascript
копировать
#cgo linux,amd64 LDFLAGS: /lib/linux/liba.a
#cgo linux,arm64 LDFLAGS: /lib/linux/liba_arm.a

копировать

Эквивалентно

Язык кода:javascript
копировать
#cgo linux,!arm64 LDFLAGS: /lib/linux/liba.a
#cgo linux,!amd64 LDFLAGS: /lib/linux/liba_arm.a

копировать

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

В это время блок-схема становится такой:

Идеальный!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose