CentOS7에서sqlite3 포함CGO의 Golang 프로그램arm에 교차 컴파일하기

3967 단어
CentOS7에서sqlite3 포함CGO의 Golang 프로그램arm에 교차 컴파일하기
전재 설명 출처: 본 논문은 osnosn의 블로그에서 링크되었고 2019-10-28.
Golang 프로그램을 만들었습니다. 이 CGO 라이브러리 github.com/mattn/go-sqlite3 를 사용하여 sqlite3을 지원합니다.x8664기계에서 컴파일 실행 모두 ok.또한arm기계가있어서armbian을 장착했습니다.x8664기계에서arm64로 교차 컴파일되어 약간의 문제에 부딪혔다.
더듬어 보니 해결된 것 같다.필기를 해서 후배들에게 참고하게 하다.
환경:
  • x86_64기계,centos7,64비트 장착.
  • arm기계,aarch64-Linux-5.0.2-aml-s905,littleendian, armbian 장착, 64비트.

  • 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를 사용해 보십시오
  • centos7에 설치, 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
  • build일 때sysroot의 위치를 지정합니다.
  • 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)
  • centos7에 설치, 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
  • build일 때sysroot의 위치를 지정합니다.
  • 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의 블로그에서 온 것입니다.

    좋은 웹페이지 즐겨찾기