티스토리 뷰

맥 에서 go 언어를 이용하여 리눅스(.so)와 윈도우(.dll) 용 64비트 라이브러리를 빌드할 일이 생겼다.(난 웹개발자...어쩌다 이런걸...)

 

 

1. 테스트 코드 작성 

package main

import (
	"C"
	"fmt"
)

//export SayHello
func SayHello() string {
    // 반드시 함수명 위에 "//export <함수명>" 을 적어 주어야 한다고 한다. 
    fmt.Println("i say hello. you say...what?")
    return "TEST"
}

func main() {
	// 공유 라이브러리를 만들기 위해서는 비어 있는 main() 이 필요하다고 한다.
}

 

2. 맥에서 맥용 64비트 라이브러리 빌드

freecatz:src $ CGO_ENABLED=1 GODEBUG=cgocheck=0 go build -v -o test.dyld -buildmode=c-shared ./main.go

runtime/cgo

_/Users/freecatz/go/src

freecatz:src $ file test.dyld 

test.dyld: Mach-O 64-bit dynamically linked shared library x86_64

 

* GOARCH=386 으로 주고 빌드 하려면 맥용 gcc 32비트가 필요 한 듯 하다.

 

 

3. 맥에서 윈도우 64비트 라이브러리 빌드 

freecatz:src $ brew install mingw-w64

* mingw-w64를 brew 나 직접 설치 한다. 직접 설치 하는 경우 환경 변수 PATH 설정 필요.

freecatz:src $ CGO_ENABLED=1 GODEBUG=cgocheck=0 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build -v -o test.dll -buildmode=c-shared ./main.go

runtime/cgo

_/Users/freecatz/go/src

freecatz:src $ file test.dll 

test.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows

 

* GOARCH=386 으로 주고 빌드 하려면 맥용 mingw-w32(또는 비슷한 패키지)를 설치 해야 할 것 같다. 우선 32비트는 필요 없으니 64비트용으로만 빌드 하고 넘어 간다.

 

 

4. 맥에서 리눅스 32, 64비트 라이브러리 빌드

이 부분에서는 https://mingrammer.com/cgo-cross-compile-for-mac-for-linux/ 를 참고 하였다.

우선 http://crossgcc.rts-software.org/doku.php?id=compiling_for_linux 에 방문 하여  맥에서 사용 가능한 리눅스 C/C++ 컴파일러를 다운로드 받아 설치 한뒤, PATH에 /usr/local/gcc-[버젼]-for-linux[32 or 64]/bin 의 경로를 넣어 준다. 본인의 경우에는 32, 64 비트용 모두 설치 하였다.

 

freecatz:src $ vi ~/.bash_profile

export GCC_LINUX64=/usr/local/gcc-4.8.1-for-linux64
export GCC_LINUX32=/usr/local/gcc-4.8.1-for-linux32

export PATH=$PATH:$GCC_LINUX32/bin:$GCC_LINUX64/bin

freecatz:src $ source ~/.bash_profile

 

4-1. 리눅스 32비트 라이브러리 빌드 

freecatz:src $ CGO_ENABLED=1 GODEBUG=cgocheck=0 GOOS=linux GOARCH=386 CC=i586-pc-linux-gcc go build -v -o test.so -buildmode=c-shared ./main.go

runtime/cgo

_/Users/freecatz/go/src

freecatz:src $ file test.so 

test.so: ELF 32-bit LSB shared object Intel 80386, version 1 (SYSV), dynamically linked, with debug_info, not stripped

 

4-2. 리눅스 64비트 라이브러리 빌드 

freecatz:src $ CGO_ENABLED=1 GODEBUG=cgocheck=0 GOOS=linux GOARCH=amd64 CC=x86_64-pc-linux-gcc go build -v -o test.so -buildmode=c-shared ./main.go

runtime/cgo

_/Users/freecatz/go/src

freecatz:src $ file test.so

test.so: ELF 64-bit LSB shared object x86-64, version 1 (SYSV), dynamically linked, with debug_info, not stripped

 

 

5. 참고

https://cholchori.tistory.com/1509?category=673856 를 참고 하여  컴파일시 -ldflags="-s -w" 옵션을 주는 경우 결과물의 사이즈를 줄일 수 있었다.

 

 

부록. go 언어 에서 지원 하는 cross compile 가능 플렛폼

원본 : https://cholchori.tistory.com/1413?category=673856

GOOS GOARCH
android arm
darwin 386
amd64
arm
arm64
dragonfly amd64
freebsd 386
amd64
arm
linux 386
amd64
arm
arm64
ppc64
ppc64le
mips
mipsle
mips64
mips64le
s390x
netbsd 386
amd64
arm
openbsd 386
amd64
arm
plan9 386
amd64
solaris amd64
windows

386
amd64

* 2019.09 자료로 앞으로 지원 가능한 플렛폼 이나 아키텍쳐가 늘어날것으로 생각 된다.

 

 

 

이제 gomobile 를 이용한 안드로이드, 아이폰용 라이브러리 빌드에 대해서 찾아 봐야 겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함