CentOS7에서sqlite3 포함CGO의 Golang 프로그램arm에 교차 컴파일하기
전재 설명 출처: 본 논문은 osnosn의 블로그에서 링크되었고 2019-10-28.
Golang 프로그램을 만들었습니다. 이 CGO 라이브러리
github.com/mattn/go-sqlite3
를 사용하여 sqlite3을 지원합니다.x8664기계에서 컴파일 실행 모두 ok.또한arm기계가있어서armbian을 장착했습니다.x8664기계에서arm64로 교차 컴파일되어 약간의 문제에 부딪혔다.더듬어 보니 해결된 것 같다.필기를 해서 후배들에게 참고하게 하다.
환경:
go로 직접 교차 컴파일 시도하기
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-w -s" -o arm-mygofile mygofile.go
교차 컴파일에 실패했습니다.CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-w -s" -o arm-mygofile mygofile.go
로 교차 컴파일에 성공했지만 실행할 때 sqlite3 라이브러리가 불러오지 않았습니다.Golang은 CGO가 없을 때 직접 교차 컴파일할 수 있습니다.CGO 있으면 안돼.
arm의 gcc를 사용해 보십시오
yum install gcc-arm-linux-gnu
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnu-gcc go build -ldflags "-w -s" -o arm-mygofile mygofile.go
교차 컴파일에 실패했습니다.stdlib이래.h못 찾겠어요.arm-linux-gnu-gcc -v
에서sysroot 디렉터리/usr/arm-linux-gnu/sys-root/
가 비어 있는 것을 보았습니다.yum search에서도 대응하는 가방을 찾지 못했다.컴파일용 헤드 파일과 라이브러리 파일만 수동으로 다운로드할 수 있을 것 같습니다.arm 실행 파일을 교차 컴파일하기 (32bit)
yum install gcc-arm-linux-gnu
https://releases.linaro.org/components/toolchain/binaries/
찾기latest-7
arm-linux-gnueabi/sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi.tar.xz
tar Jxvf sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi.tar.xz
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnu-gcc CGO_CFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/" CGO_LDFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/" go build -ldflags "-w -s" -o arm-mygofile mygofile.go
으로 번역에 성공했습니다.그러나 copy가armbian에 도착하면 실행할 수 없습니다. (동적 라이브러리ld-linux.so를 찾을 수 없습니다.)32개의 동적 라이브러리를 찾지 못한 것 같습니다.
-static 매개 변수를 추가하려고 시도합니다.정적 링크를 사용합니다.
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnu-gcc CGO_CFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/" CGO_LDFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/ -static" go build -ldflags "-w -s" -o arm-mygofile mygofile.go
로 컴파일했습니다. (오류 경고가 있습니다. sqlite3이glibc 동적 라이브러리를 사용했다고 합니다.)copy가armbian에 도착하면 정상적으로 실행됩니다.실행 파일은 32비트 정적 링크입니다.성공한 것 같아---
armeb-linux-gnueabihf
중의 sysroot-glibc-linaro....-armlinux-gnueabihf.tar.xz
파일을 사용해도 될 것 같습니다.듣자니 64비트의arm은 기본적으로 hf를 가지고 있다고 한다.나는 시도하지 않았다.s905,armv8인 것 같아요.아마 armv8l-linux-gnueabihf
써도 될 거예요.나도 안 해봤어.aarch64 실행 파일 교차 컴파일(64bit)
yum install gcc-aarch64-linux-gnu
https://releases.linaro.org/components/toolchain/binaries/
찾기latest-7
aarch64-linux-gnu/sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu.tar.xz
tar Jxvf sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu.tar.xz
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC="aarch64-linux-gnu-gcc" CGO_CFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu/" CGO_LDFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu/" go build -ldflags "-w -s" -o arm-mygofile mygofile.go
으로 번역에 성공했습니다.copy가armbian에 도착하면 정상적으로 실행됩니다.실행 파일은 64비트 동적 링크입니다.--성공했어---
armbian에서arm의golangbuild로 직접 얻은 실행 파일도 64비트 동적 링크입니다.하지만 부피는 작아야 한다.교차 컴파일보다 몇 백 KB 작습니다.왜 그런지 모르겠다.
전재 설명 출처: 이 링크는 osnosn의 블로그에서 온 것입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.