티스토리 뷰
맥 에서 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
- 엘리스센터
- TIP
- Fun
- Review
- place
- devel
- JavaScript
- gpkiapi
- Linux
- Security
- 맛집
- Flutter
- samba
- Mobile
- dart
- Android
- food
- kotlin
- Java
- web
- springboot
- Compile
- MySQL
- json parse
- HTTP
- development
- SSL
- devtools
- ssh
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |