В современных компьютерных системах X86 и ARM64 представляют собой две распространенные процессорные архитектуры. Чтобы удовлетворить потребности различных архитектур, образы Docker также должны поддерживать упаковку с двойной архитектурой. В этой статье будет представлена практика унификации упаковки образов Docker с двойной архитектурой.
В образах Docker это обычно достигается с помощью многоэтапной сборки. На первом этапе создается двоичный файл, соответствующий сервису архитектуры; на втором этапе запускается двоичный файл, соответствующий архитектуре. Ниже приведены два примера файлов Dockerfile на основе Debian, которые используются для создания образов Docker. для архитектуры X86 и архитектуры ARM64:
1.Пример файла Dockerfile для архитектуры X86:
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:
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-скрипт
#!/bin/bash
docker build -t myapp:x86 -f Dockerfile.x86 .
docker manifest create myapp:latest myapp:x86
docker manifest push myapp:latest
копировать
2. Баш-скрипт Arm64
#!/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 в компьютерных системах с различной архитектурой.
Конкретный процесс примерно следующий:
Из приведенной выше блок-схемы видно, что для компиляции образов с двойной архитектурой в основном требуются два совершенно независимых набора сценариев, что, очевидно, увеличит объем кода и затраты на обслуживание. Итак, существует ли сценарий и процесс, которые могут унифицировать упаковку с несколькими архитектурами. ? Внутри? Ответ очевиден. Давайте рассмотрим описанный выше процесс в качестве примера создания набора унифицированных сценариев компиляции для нескольких архитектур.
Первый — скомпилировать сценарий запуска build_docker.sh для образа. Причина, по которой здесь используются два сценария, заключается в том, что необходимо выполнять разные файлы docker. Фактически, вы можете динамически принимать решение о выполнении разных файлов dockers, передавая параметры, такие как. следующий пример:
#!/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, чтобы избежать путаницы и обеспечить согласованность на уровне команд, например:
#!/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.,Удобная совместимость с существующими скриптами.。Если переданоиз Архитектура Параметр не поддерживается,Скрипт выведет сообщение об ошибке и завершит работу.
Конечно, бизнес-потребность может заключаться в одновременной компиляции нескольких архитектур, тогда этот скрипт необходимо обновить:
#!/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 и соответствующий файл докеров:
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 унифицирован.
Прямо сейчас
Прямо сейчас,В основном решена проблема слияния и унификации build_docker.shиз,Теперь нам все еще нужно решить проблему согласованности файлов док-файлов.
существовать Прямо сейчасизbuild_dockerиспользуется в скриптах
docker build
или
docker buildx build
--platform
иззапуск командыdockerfileдокумент
Здесь файл dockerfile необходимо упаковать в соответствии с различной архитектурой.,Содержание другое,Поэтому я написал два файла dockerfile.x86иdockerfile.arm.
Если вы можете передать информацию об архитектуре в файл docker, вы можете объединить два файла в один.
Основными командами выполнения здесь являются:
docker build --build-arg ARCH=x86_64 -t myimage:x86_64 .
копировать
Соответствующий файл dockerfile:
# Параметры сборки
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, здесь нужно выбрать еще несколько скриптов установки.
Измените приведенный выше скрипт следующим образом:
# Параметры сборки
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.
Тогда ситуация становится такой:
На шаг ближе к успеху
Как и выше, измените его, передав переменные
#!/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 для персонализированных изменений.,Например, сценарий установки такой:
#!/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
копировать
Сценарий внешнего звонка можно настроить следующим образом.
#!/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из?
Здесь автор также сравнивает различия между ними.
наконец,Здесь предлагается хранить базовые зависимости установки отдельно как базовое зеркало.,Это позволяет избежать дублирования в нескольких предприятиях.
Это происходит примерно так:
В Голанге,Мы можем добиться создания нескольких архитектур с разными суффиксами файлов. Это связано с тем, что инструмент компилирования Golang может определить тип требуемой компиляции архитектуры на основе суффикса файла. первый,Давайте посмотрим на значение различных суффиксов файлов. В Голанге,Суффиксы файлов обычно состоят из двух частей.,Это Операционная система (GOOS) и Архитектура (GOARCH). Например,Имя файла — «hello_windows_amd64.exe».,«Windows» означает, что установлена операционная система Windows.,«amd64» означает «Архитектура» для 64-битной архитектуры изx86.
Вот базовый пример Голанга:
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
копировать
В операционной системе Linux вы можете использовать следующую команду для компиляции программы:
$ go build -o hello_windows_amd64.exe
копировать
В архитектуре процессора ARM для компиляции программы можно использовать следующую команду:
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
Поэтому при адаптации,Соответствующая реализация метода может быть определена отдельно в зависимости от компилируемых платформ и файлов.,например:
CGO — это инструмент на языке Go для взаимодействия с языком C.,Это позволяет нам вызывать функции языка C и использовать библиотеки языка C на языке Go. Пока занимаюсь CGO компилировать,Нам необходимо рассмотреть проблему множества систем и множества архитектур.,Чтобы гарантировать, что наша программа может нормально работать в различных операционных системах и архитектурах.
Вот некоторые методы мультисистемной мультиархитектуракомпилизации CGO:
Используйте переменную среды CGO_ENABLED. Переменную среды CGO_ENABLED можно использовать для управления включением CGO. При выполнении мультисистемной мульти-Архитектуракомпилировать,Мы можем установить переменную среды CGO_ENABLED на 0.,Это отключит CGO,Это позволяет избежать проблем в различных операционных системах и архитектурах.
Ниже приведен конкретный пример,Предположим, нам нужно скомпилировать программу Go, использующую библиотеку libcurl.,ии нужносуществоватьLinuxиWindowsоперационная система соответственнокомпилироватьвнеx86иx64 Архитектура программы。Мы можем сделать это, используя следующую командукомпилировать:
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 Архитектура программы
Используйте инструмент кросс-компиляции. Инструмент кросс-компиляции позволяет нам создавать несколько программ для разных операционных систем на одной машине. Пока занимаюсь CGO компилировать,Мы можем использовать инструмент кросс-компиляции для компиляции программ для нескольких разных операционных систем.,Это гарантирует, что наши программы смогут нормально работать в различных операционных системах.
Ниже приведен подробный пример перекрестной компиляции iscgo.,Предположим, нам нужно скомпилировать программу Go, использующую библиотеку libcurl.,ии нужносуществоватьLinuxиWindowsоперационная система соответственнокомпилироватьвнеx86иx64 Архитектура программы。
Установите инструменты кросс-компиляции. Сначала нам нужно установить инструменты кросс-компиляции. В системе Ubuntu мы можем использовать следующую команду для установки инструмента кросс-компиляции:
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. Предположим, что наш программный код выглядит следующим образом:
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 Архитектура:
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 Архитектура программы:
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
Используйте CGO Ключевые слова, такие как ЛДФЛАГС. При компиляции CGO мы можем использовать CGO Ключевые слова, такие как LDFLAGS.Для указания ссылки необходимаиз Библиотекаикомпилировать Параметры。Эти ключевые слова позволяют намсуществоватьдругойиз Операционная системаи Архитектураиспользуется в разныхиз Связь Библиотекаикомпилировать Параметры,Это гарантирует, что наши программы смогут нормально работать в различных операционных системах.
Директива #cgo — это ключевое слово, используемое для вызова функций и библиотек языка C на языке Go. Это позволяет нам использовать язык C из функций и библиотеки на языке Go.,Тем самым расширяя функциональность языка Go. При выполнении cgo multi Архитектуракомпилировать,Мы можем использовать директиву #cgo, чтобы указать параметры компиляции в разных операционных системах.
Вот некоторые директивы #cgo, используемые в многоцелевой архитектуре cgo:
#cgo CFLAGS #cgo Директива CFLAGS может использоваться для указания параметров компиляции изкомпилировать язык C. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Директива CFLAGS для указания опций компилирования под разные операционные системы. Например, мы можем использовать следующую директиву, чтобы указать опцию компилировать ARM Архитектура:
#cgo CFLAGS: -march=armv7-a -mfpu=neon
копировать
Эта директива скомпилирует код языка C с использованием параметров компиляции -march=armv7-a и -mfpu=neon в рамках архитектуры ARM.
#cgo LDFLAGS #cgo Директива LDFLAGS может использоваться для указания параметров компоновщика. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Директива LDFLAGS для указания параметров ссылки в разных операционных системах и архитектурах. Например, мы можем использовать следующую директиву, чтобы указать Windows Варианты ссылок x64 Архитектура:
#cgo LDFLAGS: -L/usr/local/lib -lcurl
копировать
Эта директива свяжет библиотеку libcurl с использованием параметров ссылки -L/usr/local/lib и -lcurl в архитектуре Windows x64.
#cgo windows #cgo Команду Windows можно использовать для указания параметров компиляции в операционной системе Windows. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Команда Windows для указания параметров компилирования в разных операционных системах. Например, мы можем использовать следующую команду, чтобы указать опцию «изкомпилировать» в операционной системе Windows:
#cgo windows CFLAGS: -D_WIN32_WINNT=0x0601
копировать
Эта инструкция будет использовать параметр компиляции -D_WIN32_WINNT=0x0601 для компиляции кода языка C в операционной системе Windows.
#cgo linux
#cgo Команду Windows можно использовать для указания параметров компиляции в операционной системе Linux. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Команда Linux для указания параметров компилирования в разных операционных системах. Например, мы можем использовать следующую команду, чтобы указать опцию «изкомпилировать» в операционной системе Linux:
#cgo linux CFLAGS: -D_GNU_SOURCE
копировать
Эта директива будет использовать параметр компиляции -D_GNU_SOURCE для компиляции кода языка C в операционной системе Linux.
#cgo darwin #cgo Команду darwin можно использовать для указания опции компилировать в операционной системе macOS. При выполнении нескольких компилирований Архитектуры мы можем использовать #cgo. Директива darwin для указания опций компилирования под разные операционные системы. Например, мы можем использовать следующую команду, чтобы указать опцию «изкомпилировать» в операционной системе macOS:
#cgo darwin CFLAGS: -mmacosx-version-min=10.10
копировать
Эта директива будет использовать параметр компиляции -mmacosx-version-min=10.10 для компиляции кода языка C в операционной системе macOS.
#cgo linux,arm64 и #cgo linux,amd64
#cgo linux,amd64 LDFLAGS: /lib/linux/liba.a
#cgo linux,arm64 LDFLAGS: /lib/linux/liba_arm.a
копировать
Эквивалентно
#cgo linux,!arm64 LDFLAGS: /lib/linux/liba.a
#cgo linux,!amd64 LDFLAGS: /lib/linux/liba_arm.a
копировать
Благодаря согласованности двух вышеуказанных уровней кода при компиляции можно получить, что слияние и унификация также могут быть достигнуты на этапе компиляции.
В это время блок-схема становится такой:
Идеальный!