go ๋ง์ปค๋ ํ์ฌ msvc ๊ฐ์ฒด ํ์ผ์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ ์ด ๋ฌธ์ ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ์ ์์์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ Windows ์ํฌํ๋ก๋ฅผ ๋ค์ ๋จ์ํํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ฃผ๋ก ์ผ๋ง๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ์ง ๋ฐ/๋๋ ๋ฌด์์ด ํ์ํ์ง ์ดํดํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
/cc @alexbrainman
@xoviat ์ด๋ค ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์ฌ๊ธฐ์์ ์ฌํํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์ฌํํ๊ธฐ ์ํด ๋ฐ๋ผ์ผ ํ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ ๊ณตํ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค
์๋ ์ค
์ถ์ : 7์ ๋ง๊น์ง๋ ์ปดํจํฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ผ ์ด๊ฒ๋ถํฐ ๋ณผ๊ฒ์.
๋น์ ์ด ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น?
์์ง ์๋ํ์ง ์์์ง๋ง msvc ๊ฐ์ฒด ํ์ผ์์ c ํจ์๋ฅผ go ๋ง์ปค์ .syso๋ก ์ฐ๊ฒฐํ์ฌ ๊ตฌ์ฒด์ ์ผ๋ก ํธ์ถํ๊ณ ์ถ์ต๋๋ค. ๋ด๊ฐ ์ฝ์ ๋ชจ๋ ๊ฒ์ ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์๋ค๋ ๊ฒ์ ๋ํ๋ด์ง๋ง ๋ฐ์ํ๋ ํน์ ์ค๋ฅ๋ฅผ ์ฌํํ๋ ์ ์ฐจ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
ํนํ go ๋ง์ปค๋ฅผ ์ฌ์ฉํ์ฌ .syso๋ก ์ฐ๊ฒฐํ์ฌ msvc ๊ฐ์ฒด ํ์ผ์์ c ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด๊ฒ์ DLL๋ก ๋น๋ํ๊ณ DLL ๋ด๋ถ์์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?
๋ฐ์ํ๋ ํน์ ์ค๋ฅ๋ฅผ ์ฌํํ๋ ์ ์ฐจ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
์ ๋ฐ. ๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
์ด๊ฒ์ DLL๋ก ๋น๋ํ๊ณ DLL ๋ด๋ถ์์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?
๊ทธ๊ฒ์ด ์ฌ์ค ๋์ ์๋ ๊ณํ์ด์๋ค. swig๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์์ฑ๋ c ์ฝ๋๋ฅผ ๋ณ๋๋ก ์ปดํ์ผํ ๋ค์ DLL ๋ด๋ณด๋ด๊ธฐ๋ก ํจ์๋ฅผ ๋ค์ ์์ฑํ๋ ๊ฒ์ด ๊ทธ๋ฆฌ ํธ๋ฆฌํ์ง ์์ต๋๋ค. ์ด๋ ต์ง๋ ์์ง๋ง gcc๋ฅผ ์ฌ์ฉํ๋ ์ํฌํ๋ก๊ฐ go generate; go build
๋ถ๊ณผํ ๋ ์ฑ๊ฐ์ ์ผ์
๋๋ค.
์๊ฒ ์ต๋๋ค. ์ ์ฐจ๊ฐ ์์ต๋๋ค. ๋ค์ ํ์ผ๋ก ์์ํ์ญ์์ค.
์๋ ํ์ธ์.๊ณ :
package main
/*
extern void hello();
*/
import "C"
func main() {
C.hello()
}
์๋ ํ์ธ์.c:
#include <stdio.h>
extern void hello()
{
printf("Hello World from C");
}
๊ทธ๋ฐ ๋ค์ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค(๊ฒฝ๋ก์ msvc ์ฌ์ฉ).
cl /c hello.c
mv hello.obj hello.syso
mv hello.c hello.c.bak
go build
๊ฒฐ๊ณผ:
Warning: corrupt .drectve at end of def file
์์ฑ๋ ํ์ผ์ ์คํํ ๋:
Exception 0xc0000005 0x8 0x13 0x13
PC=0x13
signal arrived during external code execution
main._Cfunc_hello()
_//_obj/_cgo_gotypes.go:41 +
main.main()
C://hello.go:9 +0x27
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:2197 +0x1
rax 0x4a5960
rbx 0xc042045f78
rcx 0x4a9a20
rdi 0xc042045f78
rsi 0x4adc60
rbp 0xc042045f38
rsp 0x6dfd68
r8 0xc042016340
r9 0x0
r10 0xc04204faa0
r11 0x4783c2
r12 0x0
r13 0x6
r14 0x0
r15 0xf1
rip 0x13
rflags 0x10216
cs 0x33
fs 0x53
gs 0x2b
๋ด PC์ cl ๋ช ๋ น์ด ์ค์น๋์ด ์์ง ์์ต๋๋ค. msvc๋ ์ด๋ป๊ฒ ์ค์นํ๋์?
๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
์ฌ๊ธฐ์ "๋น๋ ๋๊ตฌ 2017"์ด ํ์ํฉ๋๋ค. Microsoft๋ ์ด์ ์์ ์ ๊ฐ๋ฐ์ด ์๋ ํ ๋๊ตฌ๋ Visual Studio๋ฅผ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ฌด ๋ฒ๊ฑฐ๋ก์ฐ์๋ฉด ์ค๋ธ์ ํธ ํ์ผ๋ง ์ฃผ์๋ฉด ๋ฉ๋๋ค.
C++๋ง ๋ฌธ์ ๊ฐ ์๋์๋ค๋ฉด ๋๋ ์ด๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ธฐ์ ๊ณ ํต์ ๊ณ์๋๋ค...
์ฌ๊ธฐ์ "๋น๋ ๋๊ตฌ 2017"์ด ํ์ํฉ๋๋ค.
์์์ด์. ๊ฐ์ฌํฉ๋๋ค.
๋๋ฌด ๋ฒ๊ฑฐ๋ก์ฐ์๋ฉด ์ค๋ธ์ ํธ ํ์ผ๋ง ์ฃผ์๋ฉด ๋ฉ๋๋ค.
์, hello.obj๋ฅผ ์ด๋๊ฐ์ ๊ฒ์ํ์ญ์์ค.
์ด๊ฒ์ ๋ํด ์ข ๋ ์๊ฐํ์ญ์์ค. ์ค์ ๋ก gcc๋ฅผ ์ฌ์ฉํ์ฌ msvc ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ๋ ๊ฐ์ฒด ํ์ผ์ ์ฐ๊ฒฐํ๊ณ ์์ต๋๋ค. ์ด๋์ ์๋ํ๊ณ ์ํํ ์ ์์ง๋ง "go build" ๋จ๊ณ๋ฅผ hello.obj๋ฅผ C ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํ๋ gcc๋ก ๋์ฒดํฉ๋๊น? ์๋ง๋ ์ด์ ์ ์ํ๋ ์ ์ด ์์ ๊ฒ์ ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ค๋ฉด ๋ฐ๋์์๋ ๋น์ทํ ์ผ์ ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์๋ ์ค
AFAIK lld https://github.com/llvm-mirror/lld ๋ msvc ๊ฐ์ฒด ํ์ผ์ ์ง์ํฉ๋๋ค.
๊ฐ์ฒด ํ์ผ์ ์ฌ๊ธฐ: https://github.com/xoviat/msvcgo/blob/master/hello.syso
lld https://github.com/llvm-mirror/lld ๋ msvc ๊ฐ์ฒด ํ์ผ์ ์ง์ํฉ๋๋ค.
Go๋ Windows์์ gcc ๋ง์ปค(lld ์๋)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฒด ํ์ผ์ ์ฌ๊ธฐ: https://github.com/xoviat/msvcgo/blob/master/hello.syso
8์์ ์ง์ ๊ฐ๋ฉด ํด๋ด์ผ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์.
์๋ ์ค
Go๋ Windows์์ gcc ๋ง์ปค(lld ์๋)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์์. ๊ทธ๋ฌ๋ lld๋ msvc ๊ฐ์ฒด ํ์์ ์ต๊ณ ์ ์คํ ์์ค ๋ฌธ์์ ๋๋ค.
์ค์ ๋ก ld์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ค๋ฅ๋ ํ์คํ ld์์ ๋ฐ์ํฉ๋๋ค.
์ค์ ๋ก ld์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ค๋ฅ๋ ํ์คํ ld์์ ๋ฐ์ํฉ๋๋ค.
์. msvc๋ก ๋ถ๋ถ์ ์ปดํ์ผํ๊ณ gcc๋ก ์ฐ๊ฒฐํ์ฌ C ํ๋ก๊ทธ๋จ์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค.
์๋ ์ค
๋ด ๋ฌด์ง๋ฅผ ์ฉ์ํ์ง๋ง ์ ํํ gcc ์ฐ๊ฒฐ์ ๋ฌด์์ ๋๊น? go ๋ง์ปค์ ์ถ๋ ฅ์ ์ฐ๊ฒฐํ๊ณ ์์ต๋๊น?
elf๋ก ๋ณํํ๊ธฐ ์ํด ์ค๋ธ์ ํธ ํ์ผ์์ objconv ์คํ:
objconv -felf hello.obj hello.syso
์ด์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
hello.syso: In function `__local_stdio_printf_options':
(.text$mn+0x3): undefined reference to `?_OptionsStorage@?1??__local_stdio_printf_options@@9<strong i="9">@9</strong>'
hello.syso: In function `_vfprintf_l':
(.text$mn+0x3a): undefined reference to `__stdio_common_vfprintf'
hello.syso: In function `printf':
(.text$mn+0x28): undefined reference to `__acrt_iob_func'
collect2.exe: error: ld returned 1 exit status
์๋ง๋ stdio๊ฐ ํ๊ณ๊ฐ ์์ต๋๊น?
๋ด ๋ฌด์ง๋ฅผ ์ฉ์ํ์ง๋ง ์ ํํ gcc ์ฐ๊ฒฐ์ ๋ฌด์์ ๋๊น? go ๋ง์ปค์ ์ถ๋ ฅ์ ์ฐ๊ฒฐํ๊ณ ์์ต๋๊น?
2๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ Go ํ๋ก๊ทธ๋จ์ ๋น๋ํฉ๋๋ค.
๋๋๋ก(ํจํค์ง ์ค ํ๋๊ฐ Cgo๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) Go ๋ง์ปค๋ ์ธ๋ถ ๋ง์ปค๋ฅผ ํธ์ถํ์ฌ C๋ก ๊ตฌํ๋ ๋ชจ๋ ๋นํธ๋ฅผ ์ฐพ์ต๋๋ค. C ์ฝ๋์์ printf๋ฅผ ํธ์ถํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. C printf ์ปดํ์ผ๋ ์ฝ๋๋ Go ์คํ ํ์ผ์ ์ผ๋ถ์ฌ์ผ ํ์ง๋ง Go ๋ง์ปค๋ ์ด๋์ ์ป์ ์ ์๋์ง ๋ชจ๋ฆ ๋๋ค. ๋ฐ๋ผ์ Go ๋ง์ปค๋ ํด๋น ์ฝ๋๋ฅผ ํฌํจํ๊ธฐ ์ํด ์ธ๋ถ ๋ง์ปค๋ฅผ ํธ์ถํฉ๋๋ค.
Current Go๋ gcc ์ปดํ์ผ๋ฌ/๋ง์ปค๋ฅผ ์ฌ์ฉํ์ฌ C ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์ฐ๊ฒฐํฉ๋๋ค(์ฐ๋ฆฌ๋ mingw gcc ์ฌ์ฉ). ๋ค๋ฅธ ์ปดํ์ผ๋ฌ(Microsoft)๋ก C ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ค๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ง๋ ๋ชจ๋ ์ธ๋ถ C ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ํด๋น ๋ง์ปค(Microsoft)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋์ gcc ๋ง์ปค๋ฅผ ์ฌ์ฉํ์๊ณ ์ ์ํ ๊ฒ์ด ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ Microsoft ์ปดํ์ผ๋ฌ์ ๋ง์ปค๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Microsoft ๋ง์ปค๊ฐ ์ ๋ ฅ์ผ๋ก ์๊ตฌํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ํ์ ํ๊ณ ์ผ์น์์ผ์ผ ํฉ๋๋ค.
C ์ฝ๋์ ์ธ๋ถ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ MC ๋ง์ปค ์์ด ๋ฒ์ด๋ ์ ์์ต๋๋ค. (2๊ฐ์ ์ ์๋ฅผ ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์) ์ ๋ง ๊ฐ๋จํ C ํ๋ก๊ทธ๋จ์ ์๋ํด ๋ณด์ญ์์ค. ์์์ ์ค๋ช ํ ๋๋ก ์๋ํ ์ ์์ต๋๋ค.
์๋ ์ค
์๋ง๋ stdio๊ฐ ํ๊ณ๊ฐ ์์ต๋๊น?
ํด๋น ์ฝ๋๋ฅผ ์ฐพ์ผ๋ ค๋ฉด Microsoft ๋ง์ปค๋ฅผ ํธ์ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ ์ค
ํ์ ์ ๋ชปํ์ง๋ง
objconv -felf hello.obj hello.syso
์๋ง๋ elf ๋์ coff ๋๋ omf๋ฅผ ์๋ํด์ผํฉ๋๊น?
์๋ง๋ elf ๋์ coff ๋๋ omf๋ฅผ ์๋ํด์ผํฉ๋๊น?
@xoviat ์, .obj ํ์ผ์ elf๋ก ๋ณํํ๋ฉด ์ ๋ฉ๋๋ค. Windows ๋ฒ์ ์ gcc๋ ๋ค๋ฅธ Windows ์ปดํ์ผ๋ฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก pe/coff ํ์ผ์ ์์ฑํฉ๋๋ค.
์๋ ์ค
Go ๋ง์ปค๋ ์ธ๋ถ ๋ง์ปค๋ฅผ ํธ์ถํ์ฌ C๋ก ๊ตฌํ๋ ๋ชจ๋ ๋นํธ๋ฅผ ์ฐพ์ต๋๋ค.
์ฌ์ฉ๋ ํน์ ๋ช ๋ น์ ๋ฌด์์ ๋๊น? mingw ๋ช ๋ น์ ์๊ณ ์๋ค๋ฉด ํ์ผ ๋น๊ต ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ msvc๊ฐ mingw๊ฐ ๋ด๋๋ ๊ฒ๊ณผ ์ผ์นํ๋๋ก ํ ์ ์์ต๋๋ค.
go build -ldflags=-v
๋ฅผ ์คํํ๋ฉด ์ ํํ ์ฃผ์์ ๋ณผ ์ ์์ต๋๋ค.
์ข์, ๋ด๊ฐ ๋งํ ์์๋ ๊ฒ์์ :
ld (link -> go.obj) + (gcc -> obj files) ==> a.out.exe
Go๋ ์ด๋ฌํ ํ์ผ๋ก ์์ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ด์ฉ์ ๊ฒ์ฌํ ์ ์๋๋ก ์์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณด์กดํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
go build -work
์๋
WORK=C:\Users\mattn\AppData\Local\Temp\go-build566171254
๊ฐ์ฒด ํ์ผ์ ์ด ๋๋ ํฐ๋ฆฌ์ ๋จ์ ์์ต๋๋ค.
-work
์ต์
์ ์ค์ ๋ก ๋ง์ปค๊ฐ ์์ฑํ๋ ์์ ํ์ผ์ ๋ณด์กดํ์ง ์์ต๋๋ค. ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ๊ฑฐํ์ง ์๋๋ก ๋ง์ปค ์์ค๋ฅผ ํธ์งํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ค ์์ผ๋ก๋ ๊ทธ์ ๋ํ ์ต์
์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ๊ฑฐํ์ง ์๋๋ก ๋ง์ปค ์์ค๋ฅผ ํธ์งํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ด์ฐฎ์ผ์๋ค๋ฉด ๋ฐ๋ณต์ ์ธ ์์ ์ ํ์ง ์๋๋ก HEAD์ ๊ตฌํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ์ต๋๋ค.
๋ด์ฉ์ ๊ฒ์ฌํ ์ ์๋๋ก ์์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณด์กดํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
cmd/link ํ๋ก๊ทธ๋จ์๋ -tmpdir ํ๋๊ทธ๊ฐ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
c:\Users\Alex\dev\src\a>dir
Volume in drive C has no label.
Volume Serial Number is 9012-A870
Directory of c:\Users\Alex\dev\src\a
06/08/2017 02:02 PM <DIR> .
06/08/2017 02:02 PM <DIR> ..
06/08/2017 02:02 PM 77 main.go
1 File(s) 77 bytes
2 Dir(s) 430,809,088,000 bytes free
c:\Users\Alex\dev\src\a>type main.go
package main
import "fmt"
import "C"
func main() {
fmt.Println("Hello")
}
c:\Users\Alex\dev\src\a>go build -o a.exe -ldflags="-tmpdir=c:\Users\Alex\dev\src\a" main.go
c:\Users\Alex\dev\src\a>dir
Volume in drive C has no label.
Volume Serial Number is 9012-A870
Directory of c:\Users\Alex\dev\src\a
06/08/2017 02:02 PM <DIR> .
06/08/2017 02:02 PM <DIR> ..
06/08/2017 02:02 PM 2,055 000000.o
06/08/2017 02:02 PM 22,376 000001.o
06/08/2017 02:02 PM 2,017,382 a.exe
06/08/2017 02:02 PM 135 fix_debug_gdb_scripts.ld
06/08/2017 02:02 PM 2,402,226 go.o
06/08/2017 02:02 PM 77 main.go
06/08/2017 02:02 PM 24 trivial.c
7 File(s) 4,444,275 bytes
2 Dir(s) 430,804,631,552 bytes free
c:\Users\Alex\dev\src\a>
์๋ ์ค
์ด๊ฒ์ ๋ด ์์ ์ ์ฐธ์กฐ์ฉ์ด์ง๋ง msvc๋ก ํฌํ ํด์ผ ํฉ๋๋ค.
_cgo_sys_thread_start(ThreadStart *ts)
{
uintptr_t thandle;
thandle = _beginthread(threadentry, 0, ts);
if(thandle == -1) {
fprintf(stderr, "runtime: failed to create new OS thread (%d)\n", errno);
abort();
}
}
static void
threadentry(void *v)
{
ThreadStart ts;
ts = *(ThreadStart*)v;
free(v);
ts.g->stackhi = (uintptr)&ts;
ts.g->stacklo = (uintptr)&ts - STACKSIZE + 8*1024;
/*
* Set specific keys in thread local storage.
*/
__asm {
"movq %0, %%gs:0x28\n" // MOVL tls0, 0x28(GS)
"movq %%gs:0x28, %%rax\n" // MOVQ 0x28(GS), tmp
"movq %1, 0(%%rax)\n" // MOVQ g, 0(GS)
:: "r"(ts.tls), "r"(ts.g) : "%rax"
}
crosscall_amd64(ts.fn);
}
๋๋ ์กฐ๋ฆฝ์ ๋ํด ์ ํ ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ณผ์ํ๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ํ ์ ์๋์ง ์์ ๊ธฐํธ:
์ข์, ์์๋ณด๋ค ๋นจ๋ฆฌ ์ฌ๊ธฐ๋ก ์ด๋ํด!
์ ์ฒด: asm_amd64.s ๋ go์ ์ด์ ๋ธ๋ฌ(์ด์ํ ์ด์ ๋ธ๋ฆฌ ํฌํจ) ๋๋ gcc์ ์ด์ ๋ธ๋ฌ์ ์ํด ์ด์ ๋ธ๋ฉ๋๊น?
gcc๊ฐ ๊ทธ๊ฒ์ ์ด์ ๋ธํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ์๋ง๋ ์ด์ ๋ธ๋ฆฌ๋ก ๊ฐ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฌธ์ ๋ go ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ก ์ด์ ๋ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋๋ runtime/cgo/asm_amd64.s๊ฐ Go ๊ฐ์ฒด๋ก ์ด์ ๋ธ๋๊ณ cmd/link๊ฐ ๋ค๋ฅธ ๋ชจ๋ Go ๊ฐ์ฒด์ ํจ๊ป ๋จ์ผ ์์คํ ๊ฐ์ฒด๋ก ์ฐ๊ฒฐ๋๊ณ ์์คํ ๋ง์ปค๊ฐ ํด๋น ๋จ์ผ ์์คํ ๊ฐ์ฒด์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค. cgo ์ข ์์ฑ์ ์ต์ข ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํฉ๋๋ค.
ํ
์คํธ ๋ชฉ์ ์ผ๋ก ์ง๊ธ ํด๋น ๊ฐ์ฒด๋ฅผ ์ด์
๋ธํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? go๋ฅผ ์ ์ธํ๊ณ gcc -c asm_amd64.s
์ ๊ฐ์ต๋๊น?
์๋๋ runtime/cgo/asm_amd64.s๊ฐ Go ๊ฐ์ฒด๋ก ์ด์ ๋ธ๋๊ณ cmd/link๊ฐ ๋ค๋ฅธ ๋ชจ๋ Go ๊ฐ์ฒด์ ํจ๊ป ๋จ์ผ ์์คํ ๊ฐ์ฒด๋ก ์ฐ๊ฒฐ๋๊ณ ์์คํ ๋ง์ปค๊ฐ ํด๋น ๋จ์ผ ์์คํ ๊ฐ์ฒด์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค. cgo ์ข ์์ฑ์ ์ต์ข ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํฉ๋๋ค.
์ง๊ธ๊น์ง ๋ค์ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ต๋๋ค.
_cgo_.o
: gcc์์ ์์ฑ, ์ฌ์ฉํ ์ ์์go.o
๋ ๊ฐ์ฅ ํฐ ๊ฐ์ฒด์
๋๋ค.
@ianlancetaylor
๋๋ ๋น์ ์ด ๋งํ ๊ฒ์ด ์ณ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. crosscall_amd64
๋ 000001.o์ ์์ง๋ง ํด๋น ํ์ผ์๋ "๋ชจ๋ go ์ฝ๋"๊ฐ ์์ต๋๋ค.
000001.o: file format pe-x86-64
SYMBOL TABLE:
[201](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x0000000000000440 crosscall_amd64
[206](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x0000000000000000 free
์ด ํ์ผ์ ๋ถ๋ช ํ ํ๋ก์ธ์ค์์ ๋๋ฌด ๋ฆ์ gcc์ ์ํด ์์ฑ๋์์ต๋๋ค.
ํ ์คํธ ๋ชฉ์ ์ผ๋ก ์ง๊ธ ํด๋น ๊ฐ์ฒด๋ฅผ ์ด์ ๋ธํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? go๋ฅผ ์ ์ธํ๊ณ gcc -c asm_amd64.s์ ๊ฐ์ต๋๊น?
asm_amd64.s๋ ๋ฐํ์ ํจํค์ง์ ์ผ๋ถ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด "go build" ๋ช ๋ น์ด asm_amd64.s ํ์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค.
$ touch asm_amd64.s
$ GOOS=windows go build -x runtime 2>&1 | grep asm_amd64.s
/home/a/go/pkg/tool/linux_amd64/asm -trimpath $WORK -I $WORK/runtime/_obj/ -I /home/a/go/pkg/include -D GOOS_windows -D GOARCH_amd64 -o $WORK/runtime/_obj/asm_amd64.o ./asm_amd64.s
$
์๋ ์ค
๊ฐ์ฌ ํด์.
crosscall_amd64
๊ธฐํธ๋ runtime/cgo/gcc_amd64.s ํ์ผ์ ์ ์๋์ด ์์ต๋๋ค. ํด๋น ํ์ผ์ ๋ชจ๋ ๋ฐํ์/cgo/gcc_* ํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก GCC์ ์ํด ์ปดํ์ผ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ Go ์ฝ๋๊ฐ ํฌํจ๋ ๋จ์ผ go.o ํ์ผ๋ก ๊ฒฐํฉ๋์ง ์์ต๋๋ค. ์ด์ ์ ์ค๋ช
ํ๋ ํ์ผ runtime/cgo/asm_amd64.s๋ crosscall2
๊ธฐํธ๋ฅผ ์ ์ํฉ๋๋ค. go.o์์ ํด๋น ๊ธฐํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๊ฐ์ฌ ํด์.
์ข์, ์ก์ธ์ค ์๋ฐ ์ ์ถฉ๋ํ๋ ์คํ ํ์ผ์ ๋งํฌํ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๋ค.
go.runtime.rt0_go+5F --> go.__acrt_stdio_initializer.
๊ทธ๊ฒ์ด ์ง๊ธ ๋ด๊ฐ ๊ฐ์ง ๋ชจ๋ ์๊ฐ์ ๋๋ค. ์ด ๋ถ๋ถ์ ๋์ค์ ๋ค์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
@alexbrainman ๋ง์ต๋๋ค.
@alexbrainman ๊ณ์ํ๋ ค๋ฉด MSVC๊ฐ ํ์ํฉ๋๋ค. ๋์์ด ํ์ํ์ง ์๋ ค์ฃผ์ญ์์ค.
๊ณ์ํ๋ ค๋ฉด MSVC๊ฐ ํ์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ค์นํ๊ณ ์๋ค https://www.visualstudio.com/downloads/#build -tools-for-visual-studio-2017
์ค์นํ ํ์๋ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
์๋ ์ค
์ค์น๊ฐ ์๋ฃ๋๋ฉด go ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ "libgo"๋ฅผ ๋น๋ํด์ผ ํฉ๋๋ค. cgo ํด๋ ์์ ๋ค์ ํ์ผ์ ๋ณต์ฌ
MSVC์ ํธํ๋๋๋ก gcc_windows_amd64.c๋ฅผ ์กฐ์ ํด์ผ ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํจ์๋ฅผ ์์ ํฉ๋๋ค.
static void
threadentry(void *v)
{
fprintf(stderr, "threadentry: started");
abort();
ThreadStart ts;
ts = *(ThreadStart*)v;
free(v);
ts.g->stackhi = (uintptr)&ts;
ts.g->stacklo = (uintptr)&ts - STACKSIZE + 8*1024;
/*
* Set specific keys in thread local storage.
*/
__writegsqword(0x28, (unsigned long long) ts.tls);
*(void **)ts.tls = (void *) ts.g;
crosscall_amd64(ts.fn);
}
"build.bat"๋ผ๋ ์ด ๋ชจ๋ ํ์ผ์ด ์๋ ํด๋์ ์ ํ์ผ์ ๋ง๋ญ๋๋ค.
REM TMP use gcc for assmebly file, in future port to ml64
gcc -c gcc_amd64.S
cl -c gcc_fatalf.c
cl -c gcc_libinit_windows.c
cl -c gcc_windows_amd64.c
cl -c gcc_util.c
ren gcc_amd64.o gcc_amd64.obj
lib gcc_amd64.obj gcc_fatalf.obj gcc_libinit_windows.obj ^
gcc_windows_amd64.obj gcc_util.obj ^
/OUT:libgo.lib
ํด๋๊ฐ ์์ฒญํ ๋๋ก ๊ตฌ์ฑ๋๋ฉด ์๋ ค์ฃผ์ญ์์ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด ์์ ๊ณผ go์ ๋ํด ๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ์ ๋ง ๋ง๋ฒ ๊ฐ์ ์ธ์ด๋ฅผ ๋ง๋ค์์ต๋๋ค.
ํด๋๊ฐ ์์ฒญํ ๋๋ก ๊ตฌ์ฑ๋๋ฉด ์๋ ค์ฃผ์ญ์์ค.
https://github.com/golang/go/issues/20982#issuecomment -327365063์ ์ค๋ช
๋ ๋๋ก libgo.lib๋ฅผ ๋น๋ํ ์ ์์์ต๋๋ค.
๋ค์์ ๋ฌด์์ ํด์ผ ํฉ๋๊น?
์๋ ์ค
์, ์ด์ ๋ค์ ํ์ผ์ด ํ์ํฉ๋๋ค.
hello.c๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#include <stdio.h>
extern void hello()
{
printf("Hello World from C");
}
hello.cgo2.o
๋ฐ go.o
๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์ ํ์ผ๋ก ์์ํด์ผ ํฉ๋๋ค.
package main
/*
extern void hello();
*/
import "C"
import "fmt"
func main() {
fmt.Println("Hello from Go!")
C.hello()
}
"hello.go"๋ผ๊ณ
$ env:TMP ์์ ํ์ผ์ ์ง์์ ์ผ๋ก ๋ณต์ฌํ๋ powershell ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ํ์ญ์์ค.
while ($true) { cp -r $env:TMP\go-* C:\Users\User\Downloads }
๊ทธ๋ฐ ๋ค์ ํด๋์์ hello.c
๋ฐ hello.go
์ ํจ๊ป go build
๋ฅผ ์คํํฉ๋๋ค. ๋ณต์ฌ๋ ์์น์์ ํ์ํ ํ์ผ์ ๋ณต๊ตฌํ ์ ์์ด์ผ ํฉ๋๋ค.
์์์ ์ง์ ํ ํ์ผ์ด ์์ผ๋ฉด ๋ค์์ ์ฌ์ฉํ์ฌ ๋น๋ํ ์ ์์ต๋๋ค.
cl libgo.lib go.o hello.cgo2.o hello.c Ws2_32.lib Winmm.lib -link /DEBUG:FULL
์ง๋ฌธ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
cl libgo.lib go.o hello.cgo2.o hello.c Ws2_32.lib Winmm.lib -link / DEBUG:FULL
๊ทธ๋ฌ๋ฉด go.exe ์คํ ํ์ผ์ด ์์ฑ๋์ง๋ง ์คํ๋์ง ์์ต๋๋ค. ๊ฑฐ๊ธฐ์๋ ํฉ๋ฆฌ์ ์ธ asm ์ฝ๋๊ฐ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ง์๋ ์๋ฌด๋ฐ๋ ๋ฐ์ด๋ค์ง ์์ต๋๋ค. ๊ทธ๋ฅ ์๋ง์ ๋๋ค.
์ด์ฉ๋ฉด ์ ๋ง ๊ฐ๋จํ ๊ฒ๋ถํฐ ์์ํด์ผ ํ ์๋ ์์ต๋๋ค. "INT $3"์ ์คํํ๊ณ ๋ค๋ฅธ ๊ฒ์ ์๋ ๋จ์ผ asm ํจ์๋ก asm ํ์ผ(Go asm ํ์ผ)์ ์์ฑํ์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ผ๋ก๋ถํฐ ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ถํด ๋ณด์ญ์์ค. ํ๋ก๊ทธ๋จ์ ๋งจ ์ฒ์์ ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ฅ์ ์คํํด์ผ ํฉ๋๋ค.
Go ๋๊ตฌ๋ฅผ ๋จผ์ ์ฌ์ฉํ๊ณ (ํ์ํ ๊ฒฝ์ฐ gcc๋ฅผ ์ฌ์ฉํ์ฌ) ๋น๋ํ ๋ค์ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์์ ์ ์๋ํฉ๋๋ค.
์๋ ์ค
์๋ ์ค, ๋์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ ์ผ์ ํ ๊ฒ์ด๋ค.
์ค์ ๋ก msvc ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉํ๋ ์๋นํ ๋ณต์กํ go ํ๋ก๊ทธ๋จ์ด ์๋ํ๊ณ ์์ต๋๋ค. ๋ฐ๋๋ผ msvc ๋ง์ปค์ llvm-lld ๋ชจ๋ .bss
์น์
์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ๋ชปํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๋ง์ปค๋ฅผ ํจ์นํ๋ฉด ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์ต๋๋ค.
๋ถํํ๋ go build
๋ _cgo_.o
/ _all.o
์์ฑํ ๋ ์ค๋จ๋ฉ๋๋ค. cgo์์ ์ด ๋ ํ์ผ์ ์์ฑํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ ์ ์์ต๋๊น?
go tool cgo
๋ฅผ ์คํํ์ฌ cgo๋ฅผ ์ง์ ์คํํ ์ ์์ต๋๋ค. ์์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://github.com/golang/go/tree/master/src/cmd/cgo
๋ํ ์ด๊ฒ์ ์คํํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ๋๋ ์ด๊ฒ์ ์๊ฐ์ ํ ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ง์ ์ด ์์์ต๋๋ค. ๋ฏธ์ํฉ๋๋ค.
์ ๋ ์ด๋ฏธ ์ผ๋ จ์ ์๋ฐ๋์ง์ ํตํด ์ฌ๋ฐ๋ฅด๊ฒ ์คํํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ ๊ฐ ํ๋ ค๊ณ ํ๋ ๊ฒ์ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ํตํฉํ์ฌ ๊ณ ํต์ ๋ ์ ์๋๋ก ํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. :-)
์๋ฐ๋์ง ๊ณผ์ ์ ๋ฌธ์ํํ ์ ์๋ค๋ฉด ์ ๊ฐ ๋์๋๋ฆด ์ ์์ต๋๋ค.
๋ณด๊ธฐ๋ง ํด๋ _cgo_.o
๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋๋ ๊ฒ ๊ฐ์ต๋๋ค(๋จ์ํ).
gcc [*.c] [*.cxx] -o _cgo_.o
์ฌ๊ธฐ์์: https://github.com/golang/go/blob/b4c84a1b010f012668b5e3ccaf63f609cd11c5fe/src/cmd/go/internal/work/exec.go#L1975
๋ํ ๋ฌธ์๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/golang/go/blob/840f2c167f1d5196559d8a1e77c370960e66d34e/src/cmd/cgo/doc.go#L607
์ด์์ ์ผ๋ก๋ ๋ง์ฐฐ์ ์ต์ํํ๊ธฐ ์ํด link.exe
์ ํธํ๋๋๋ก ๊ฐ์ฒด ํ์ผ์ ์ฌ์ ์ฒ๋ฆฌํ๋ go ํ๋ก๊ทธ๋จ์ ์์ฑํ์ง๋ง ์ด๋ ์ผ์ข
์ ํ์ฅ ๋ชฉํ์
๋๋ค.
ํฌ์ธํฐ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ณง ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋กํ๊ฒ ์ต๋๋ค.
๋ถํํ๊ฒ๋ ๋๋ ์ฐ๊ฒฐ์ ํตํด ์ํ ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค link.exe
์ฐ๋ฆฌ๊ฐ์์ ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์ถํ๋ GCC๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ํ .data
๋์ ์น์
.bss
์น์
์ -ํ์ง๋ง ์ฐ๋ฆฌ๋ ํ ์ .bss
์น์
์ ์ธ์ํ๋๋ก llvm-lld
๋ฅผ ํ์คํ ์์ ํ์ญ์์ค.
_cgo_.o
์ _all.o
๋ณ๋๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
(1) _cgo_.o
๋ go ๋ฐํ์์ ํฌํจํ์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ข
์คํ ํ์ผ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๊ตฌ์กฐ์ฒด์ ์ ์๋ฅผ ํ์
ํ๊ธฐ ์ํด DWARF ๊ธฐํธ๋ฅผ ๋ณด๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๋ฌธ์ ๋ ์ธ๋ถ์์ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํนํ msvc์์ ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ค๋ ๊ฒฝ์ฐ ์คํ ํ์ผ์ ์์ฑํ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์
๋๋ค.
์ด ๋จ๊ณ๋ฅผ ํผํ ์ ์์ต๋๊น?
(2) ํ์ฌ GCC์์ -Wl,-r
๋ฅผ ์ ๋ฌํ์ฌ GNU ld
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฐ์ฒด ํ์ผ์ _all.o
์ฐ๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ (1) ๋ค๋ฅธ ๋ง์ปค์ ์ด ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ๊ณ (2) ๋ช
๋ น์ด CGO_LDFLAGS
์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋ช
๋ น์ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
CGO_LDFLAGS="-Wl,-T,my-linker-script"
gcc .... $CGO_LDFLAGS -Wl,-r,...
๋ฒ๋ค๋ ๊ฐ์ฒด ํ์ผ ๋์ ์คํ ํ์ผ์ ์์ฑํฉ๋๋ค.
์์ฑ๋ .a
์ ๋ชจ๋ ์ค๋ธ์ ํธ ํ์ผ์ ์ง์ ๋ฃ๋ ๊ฒ์ผ๋ก ์ด ๋จ๊ณ๋ฅผ ์ ํ ํผํ ์ ์์ต๋๊น?
@zooba ์ด ํจ์น๋ก MSFT๊ฐ link.exe
๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ ๊ธฐํ๋ ๋ฌด์์
๋๊น?
๋ถํํ๋ .bss ์น์ ๋์ .data ์น์ ์์ ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋๋ก gcc๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ํ link.exe๋ฅผ ํตํด ๋งํฌ๋ฅผ ์ํํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ .bss ์น์ ์ ์ธ์ํ๋๋ก llvm-lld๋ฅผ ํ์คํ ๊ณ ์น ์ ์์ต๋๋ค. (๋ด๊ฐ ํ ์ผ์ด๋ค).
MSFT ์
๋ฐ์ดํธํ์ง ์๋ ๊ฐ์ ๊ทธ๋์ link.exe
(๊ฐ๋ฅ์ฑ์ด์๋), ๊ทธ์ ์ค๋ธ์ ํธ ํ์ผ์ ์ปดํ์ผํ๋ ๊ฒ์ด ์ข์ ๊ฒ์
๋๋ค cl.exe
๋ณด๋ค๋ gcc
.
_cgo_.o
๋ go ๋ฐํ์์ ํฌํจํ์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ข ์คํ ํ์ผ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ง์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ธํธ์ ์ค๋ธ์ ํธ ํ์ผ(์ ์๊ฐ์๋)์ด ๊ฒฐ๊ตญ ํจ๊ป ์ฐ๊ฒฐ๋ฉ๋๋ค. go.o
ํ์ผ(IIRC)์๋ ๋ชจ๋ go ์ฝ๋ + ๋ฐํ์์ด ํฌํจ๋๊ณ ๋ค๋ฅธ ๊ฐ์ฒด์๋ C ์ฝ๋๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ ๊ฐ์ฒด ์งํฉ ์ฌ์ด๋ฅผ ์ด๋ํ๋ ์ด์
๋ธ๋ฆฌ ๋ฃจํด์ด ์์ต๋๋ค.
๋ํ Unix ์ด์
๋ธ๋ฆฌ ํ์ผ์ ์ปดํ์ผํ๋ ค๋ฉด clang
๊ฐ ํ์ํฉ๋๋ค.
์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์ํด -Wl,-r
๋ lib.exe [object files] /OUT:obj
๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด ์ต์
์ "์ฆ๋ถ ๋งํฌ"๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด๋ "์ผ๋ถ ์
๋ ฅ ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ์ผ๋ถ ์์
์ ์ํํ ๋ค์ ๋ค๋ฅธ ๊ฐ์ฒด ํ์ผ์ ๋ด๋ณด๋
๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค. ์ง๊ธ "์ผ๋ถ ์์
" ๋ถ๋ถ์ ๋ํด ๊ฑฑ์ ํ์ง ์๋๋ค๋ฉด "์ผ๋ถ ์
๋ ฅ ํ์ผ ๋ฐ/๋๋ ๊ฐ์ฒด ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ๋ค๋ฅธ ๊ฐ์ฒด ํ์ผ์ ๋ฑ์ด๋ด์ญ์์ค"๋ผ๋ ์๊ตฌ ์ฌํญ์ ๋ฐ์๋ค์ผ ์ ์์ต๋๋ค. ๋์๊ด.
-fno-zero-initialized-in-bss
์ต์
์ ์ฌ์ฉํ์ฌ .bss ์น์
์ด ์๋ .data ์น์
์ ๋ณ์๋ฅผ ๋ฃ์ง ์๋๋ก GCC์ ์ง์ํ ์ ์์ต๋๋ค.
ํ์์ ์ฐ๋ฆฌ๋ cgo ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ ์ด์ -Wl,-r
์ฌ์ฉํ์ง ์์ต๋๋ค.
cmd/link๊ฐ MSVC ๊ฐ์ฒด ํ์ผ์ .syso
ํ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ดํดํ ํ์๋ ์์ต๋๋ค. ์ด๋ฌํ ํ์ผ์ ์ด์จ๋ ์ธ๋ถ ๋ง์ปค๋ก ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์ ํ์ํ ๊ฒ์ MSVC ๋ง์ปค๋ฅผ ์ธ๋ถ ๋ง์ปค๋ก ํธ์ถํ๋ ๊ฒ์ธ๋ฐ, -extld
์ต์
์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ๊ณ ๊ณ์๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฌด์์ด ์คํจํฉ๋๊น?
์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ๊ณ ๊ณ์๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฌด์์ด ์คํจํฉ๋๊น?
IIRC, gcc์์ ์์ฑ๋ ๊ฐ์ฒด์ link.exe
barfs.
์ฌ์ค, CC
ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ์ฌ MSVC C์ ์ปดํ์ผ๋ฌ๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋จ์ผ ๋งํฌ์์ GCC ๊ฐ์ฒด์ MSVC ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํ๋ ๋ฐ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฐํ์ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ปดํ์ผํ๋ ค๊ณ ํ๋ฉด cl
๊ฐ ์ ๋์ค ์ด์
๋ธ๋ฆฌ๋ฅผ ์ปดํ์ผํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋์ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ๋ฅผ ์ด์ํ๊ณ ๋งํฌ๋ฅผ ์๋ํฉ๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ํ๊ณ ์คํจํ ๊ฒ์
๋๋ค.
๊ทธ ๊ณผ์ ์์ cl
๋ ์ฝ๋์ ํต์ฌ ๋ถ๋ถ์ ์๋ชป ์ปดํ์ผํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์์ ํ๊ธฐ ์ํ ์ ์๊ฐ์ MSVC ์ฝ๋๋ฅผ ํ๋ซ C API๋ฅผ ์ฌ์ฉํ์ฌ DLL๋ก ๋ถ๋ฆฌํ ๋ค์ ์๋์ ๋ฉ์ถ ๋๊น์ง ๋ ๋ง์ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ง์ ์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์
๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ @haohui ์ ์์ด๋์ด๋ ๋ฌ๋์ต๋๋ค. ๊ทธ๋ ๋ฌธ์ ์ ๊ทผ๋ณธ์ ๊ณ ์น๊ธฐ๋ณด๋ค๋ ๋ง์ปค๋ฅผ ํจ์นํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ๋ ๋๋ณด๋ค ๋ ๋ง์ ์ฑ๊ณต์ ๊ฑฐ๋์ง๋ง, ๋์ค์ ์๊ฐํด ๋ณด๋ฉด ๊ทธ์ ์ ๊ทผ ๋ฐฉ์์ด ๋๋ณด๋ค ์ฑ๊ณตํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.
์ด ์์ (IMHO)์์ ๋ด๊ฐ ๊ถ์ฅํ๋ ๊ฒ์ ์๋์ ๋ฉ์ถ๊ฑฐ๋ gcc ์ฝ๋๊ฐ ๋จ์ง ์์ ๋๊น์ง cl
๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ง์ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ง์ ์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๊ฐ ์ด๋์ ์๋์ง ์ ํํ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ปค ํจ์น๋ฅผ ์ฌ์ฉํ๋ฉด DLL์ด ํ์ํ์ง ์์ต๋๋ค.
llvm-lld์ ํจ์น๋ https://bugs.llvm.org/show_bug.cgi?id=35283 ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๊ฐ์ ํ ์ ํ์ฌ ์์๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
+1 @haohui ์งํํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@haohui ํจ์น๊ฐ ์ ์ฉ๋๋ llvm ๋ฒ์ ์ ๋ฌด์์ ๋๊น? ํจ์น๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ MSVC ํ์ผ์ ๋งํฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ด ์์ต๋๊น?
_cgo_.o
๋ฐ _all.o
ํ์ผ๊ณผ ๊ด๋ จํ์ฌ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ์ ๋ํ ์์ ์ฌํญ์ด ๋ค๋ฅธ ๋ฌธ์ ์ ๋ํ ์์ ์ฌํญ์ผ ์๋ ์์ต๋๋ค. https://github.com/golang/go /์ด์/17014
๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ข์ ์ง์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ Go 1.11๊น์ง ๊ณ ์ ๋๋ฏ๋ก ์ด์ ํ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
๊ทธ๋์ ๋๋ ์ด์ ฏ๋ฐค์ ์ด๊ฒ์ ๋ฐ์ด ๋ค์๋ค. msvc:cl ์ ํตํด ๋ชจ๋ ๊ฒ์ ๋น๋ํ ๋ค์ msvc:link๋ฅผ ํตํด ๋ชจ๋ ๊ฒ์
๋ฐ๋ผ์ msvc:cl์ด C99๋ฅผ ์์ ํ ์ง์ํ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋จ์ํ ๋ฌธ์ ์ธ์๋(์ง๊ธ์ _Complex ์ ํ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค). go ๋ด๋ถ์์ ๋น๋ํ PE ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ msvc์์ ๋น๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒฐํฉํ๋ ๋ฐ๋ ๋ณด๋ค ์ฒด๊ณ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํนํ msvc:link ๋ .bss ์ธ๊ทธ๋จผํธ๋ฅผ ๋ ๋ ค๋ฒ๋ฆฝ๋๋ค(์ด ๋ฐ์ดํฐ๋ฅผ .data์ ๋์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค). ์ด๋ go assembler SB(pseudo reg)๊ฐ .bss๊ฐ ์ด๋๋๋ ๊ฒฝ์ฐ ์๋ชป๋ ์ฃผ์ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ ๋๋ค. .
๋ด ์ด๊ธฐ ์๊ฐ์ ์ด์ ๋ธ๋ฌ๊ฐ .bss ๋ฐ .noptrbss์ ๋ค์ด๊ฐ ํญ๋ชฉ์ ๊ฐ๊ฐ .data ๋ฐ .noptrdata์ ๋ฐฐ์นํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง์กฐ์ฐจ ํ์คํ์ง ์์ต๋๋ค. ๋ด ๋ง์ง์๊ฑฐ๋ฆฌ๋ ๊ฒ์ด ์ฑ๊ณตํ์ง ๋ชปํ๊ณ ์ฃผ์ ์ง์ ์ด ์์ ํ ์ค๋จ๋์์ต๋๋ค.
์ง๊ธ์ link.exe๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. lld-link.exe๋ก ์์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ ๋ค์ ์๋ ์๊ฐ์ด .bss ๋ฐ์ดํฐ ์ฃผ์๋ฅผ ์ด๋ํ์ง ์๋๋ก lld-link๋ฅผ ํจ์นํ ์ ์๋ค๋ ๊ฒ์ด๋ผ๋ฉด ๊ทธ ํธ์๋ฅผ ์ดํดํฉ๋๋ค. ํ์ค์ ์ผ๋ก ๋ชฉํ๊ฐ ์ค์ msvc ๋๊ตฌ ์ฒด์ธ์ ์ง์ํ๋ ๊ฒ์ด๋ผ๋ฉด ๋ด๋ถ ์ปดํ์ผ๋ก ์ด๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ .bss/.noptrbss์ ๋ฐฐ์นํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
go๋ก lld-link.exe๋ฅผ ์ฌ๋ฐฐํฌํ ์ ์๋์? LTCG๊ฐ ํ์ฑํ๋์ด ์์ง ์์ ํ MSVC ๊ฐ์ฒด ํ์ผ์ ์ง์ํ๋ ๊ฐ์ฅ ์ํ์ด ๋ฎ์ ๊ฒฝ๋ก์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์์ ์ด์ง๋ ์์ง๋ง ๋ฆฌ์์ค ์ ์ฝ์ ์ง๋ฉดํด ์์ต๋๋ค.
๋ํ ์ต์์ ์ ๋ต์ธ ์ ์ง์ ์ธ ์งํ์ ํ์ฉํฉ๋๋ค.
์ข์์, ์ข์ ํ์ ์์์ด ์์ต๋๋ค. ์ ์ฌ ์๊ฐ์ ์ด ์์ ์ ํ ์๊ฐ์ ํ ์ ํ ์ ์์์ต๋๋ค.
ํ์ฌ ๋ฌธ์ ์ ์๋ถ๋ถ์์ ์์ ํ ์๊ฐ ์์ต๋๋ค.
- hello.go:
package main
/*
extern void hello();
*/
import "C"
func main() {
C.hello()
}
- extern.c
#include <stdio.h>
extern void hello()
{
printf("Hello World from C");
}
>ac.out.exe
Hello World from C
๋ฐ์ด๋๋ฆฌ๋ MSVC ๋ฐ Go ๋๊ตฌ ์ฒด์ธ์ผ๋ก ์์ ํ ๊ตฌ์ถ๋์์ต๋๋ค(GCC ๋๋ ๊ธฐํ LLVM์ด ์ค์น๋์ง ์์).
๊ฒฐ๊ณผ:
๋ค์ ๋จ๊ณ:
์ด๋ฒ ์ฃผ๋ง์ ์๊ฐ์ด ์๋ค๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ํฌํฌ๋ก ๊ฐ์ ธ์ค๊ณ ๋น๋/๋งํฌ์ ํ๋๊ทธ ๋ค์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ค๋ ์์
์ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ PR์ ๊ฒํ ํ์ฌ ์ข
๋ฅ๋ฅผ ๊ฒฐ์ ํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค. .bss ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ๋ ๊ฒ์ด ์ด๋๊ฐ์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๊ณ 100% ํ์ ํ ์๋ ์์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ ์์๋ ์ ์ผํ ๋จ์ ์ ๋ฐ์ด๋๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ๋ ๋ ค ๋ฒ๋ฆด ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.
๊ด์ฐฎ์!
์ด๊ฑฐ ์ ๋ฆฌํ๋๋ฐ ์ดํ ๋ ๊ฑธ๋ ธ๋ค์ ์ฃ์กํฉ๋๋ค. ๋ฐ๋ผ์ ํจ์น์ ์ฒซ ๋ฒ์งธ ์ด์์ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค. https://github.com/cchamplin/go/commit/69a5cfc1dd0106fd8a2928a83e4c7001e81e89b8 :: https://github.com/cchamplin/go/tree/msvc_toolchain_support
์ด๊ฒ์ ์ฌ์ ํ โโ๊ฑฐ์นํ์ง๋ง msvc๋ก ์ฝ๋๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋น๋ํ์ต๋๋ค.
์ฌ๋๋ค์ด ์ง๊ธ ํ ์คํธ๋ฅผ ์์ํ๊ณ ๋ฒ๊ทธ๋ฅผ ๋ค์ ๋ณด๊ณ ํ์ฌ ์ ์คํธ๋ฆผ์ ์ํ ๋ ๋์ ์์น์ ์ด๋ฅผ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ๋ํ ๋๊ตฌ๋ ์ง ํ๊ธฐ ์ํ์ ์น๋ฅด๊ณ ์ถ๋ค๋ฉด ๋๋ผ์ด ์ผ์ด ๋ ๊ฒ์ ๋๋ค!
์ฉ๋ฒ:
go build -compiler msvc [path]
์ฐ๊ฒฐ๋ ํจ์น๋ก ์ธํด ๋ถํธ์คํธ๋ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
@alexbrainman toolchain1
๋ถ์คํธ๋ํ ๋จ๊ณ ์์ pkg/boostrap/src/bootstrap
๋ณต์ฌํ ํ์ผ์ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์์น๋ ๋ฌด์์
๋๊น?
cc @alexbrainman
์ฐ๊ฒฐ๋ ํจ์น๋ก ์ธํด ๋ถํธ์คํธ๋ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ฆ ๋ถํธ์คํธ๋ฉ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค( @rsc ๋ฐ @ianlancetaylor)์ด ๋์์ ์ค ์
๋ถํธ์คํธ๋ฉ์ด ์๋ํ์ง ์๋ ๊ฒฝ์ฐ @cchamplin ์ด make.bat๋ฅผ ์ด๋ป๊ฒ ์คํํ๋์ง ๊ถ๊ธํฉ๋๋ค.
์๋ ์ค
@xoviat ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ๋ชจ๋ฅด์ง๋ง ๋ถํธ์คํธ๋ฉ ๋๋ ํ ๋ฆฌ ๋ชฉ๋ก์ cmd/dist/buildtool.go์ ์์ต๋๋ค.
@alexbrainman , @ianlancetaylor , @xoviat ๋ ์ฒ ์ ํ๊ฒ ํ์ธํ์ด์ผ
๋ถํธ์คํธ๋ฉ ๋ฌธ์ ๋ฅผ ์์ ํ์ฌ https://github.com/cchamplin/go/commit/69a5cfc1dd0106fd8a2928a83e4c7001e81e89b8 ๋ถ๊ธฐ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. ์ด์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถํธ์คํธ๋ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ผ๋ถ /src/internal/syscall ๋๋ ํ ๋ฆฌ๋ฅผ cmd/internal/msvc๋ก ๋ณต์ฌํด์ผ ํ์ต๋๋ค. ๊ทธ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ๋ ๊น์? src/internal์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ง์คํธ๋ฆฌ์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ผ๋ถ /src/internal/syscall ๋๋ ํ ๋ฆฌ๋ฅผ cmd/internal/msvc๋ก ๋ณต์ฌํด์ผ ํ์ต๋๋ค. ๊ทธ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ๋ ๊น์? src/internal์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ง์คํธ๋ฆฌ์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ฆ์๋ ์ด๋ป๊ฒ ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์์ค ํ์ผ์ ์๋์ผ๋ก ๋ณต์ฌํ์ง ์๊ณ ๋ cmd/dist๊ฐ ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๋๋ฅผ ์ ์ถํ ์ค๋น๊ฐ ๋๋ฉด Russ ๋๋ Ian์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
@bradfitz ์ @ianlancetaylor ๊ฐ ์ฌ๊ธฐ์ ์ด๋ป๊ฒ ์งํํ ์ง ๊ฒฐ์ ํ ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go๊ฐ Microsoft ๋น๋ ๋๊ตฌ์ gcc๋ฅผ ์ง์ํ๊ธฐ๋ฅผ ์ํ์ญ๋๊น? ํด๋น Microsoft ๋๊ตฌ๋ฅผ ๋น๋์ ์ค์นํด์ผ ํฉ๋๋ค(CL ์๋ฝ์ ์์ํ๊ธฐ ์ ์ ์ค์นํด์ผ ํจ). ์๋ง๋ ์๋ก์ด ํ๊ฒฝ ๋ณ์๋ฅผ ๋์ ํด์ผ ํ ๊ฒ์ ๋๋ค. ์๋ก์ด ๋ฌธ์.
๋๋ต์ด ์์ธ ๊ฒฝ์ฐ @cchamplin ์ https://golang.org/doc/contribute.html์ ๋ฐ๋ผ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ถํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ์๊ฒ ์ต๋๊น? ๋ณ๊ฒฝ ์ฌํญ์ด ์๋นํ ํฌ๋ฏ๋ก ๊ฐ๋ณ์ ์ผ๋ก ๊ฒํ ํ๊ณ ์ ์ถํ ์ ์๋๋ก ๋ ์์ CL๋ก ๋ถํ ํด์ผ ํฉ๋๋ค. ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ถ๋๊ธฐ ์ ์ all.bat PASS๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ CL ์ ์ถ์ ์์ํ๊ธฐ ์ ์ ๋ชจ๋ CL์ ๋ณผ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
Go๊ฐ Microsoft ๋น๋ ๋๊ตฌ์ gcc๋ฅผ ์ง์ํ๊ธฐ๋ฅผ ์ํ์ญ๋๊น?
์ฐธ๊ณ ๋ก ์ด ํจ์น๋ ์ด๋ฏธ ์งํ ์ค์ธ ํจ์น๊ฐ ์๋ #17014๋ ์ง์ํฉ๋๋ค.
๋๋ต์ด ์์ธ ๊ฒฝ์ฐ @cchamplin ์ https://golang.org/doc/contribute.html์ ๋ฐ๋ผ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ถํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ์๊ฒ ์ต๋๊น? ๋ณ๊ฒฝ ์ฌํญ์ด ์๋นํ ํฌ๋ฏ๋ก ๊ฐ๋ณ์ ์ผ๋ก ๊ฒํ ํ๊ณ ์ ์ถํ ์ ์๋๋ก ๋ ์์ CL๋ก ๋ถํ ํด์ผ ํฉ๋๋ค.
์, ๊ทธ๊ฒ์ ๊นจ๋ ๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ๋์ด์๋ ์๋ฉ๋๋ค. ๋ชจ๋ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๊ณ , ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฑ์ ๋ ธ๋ ฅ์ ํ๊ธฐ ์ ์ ์ด๊ฒ์ด ๋ค์ด๊ฐ ๊ฐ๋ฅ์ฑ์ด ์๋ ํญ๋ชฉ์ธ์ง ์ฌ๋ถ๋ง ์๋ฉด ๋ฉ๋๋ค.
Go๊ฐ Microsoft ๋น๋ ๋๊ตฌ์ gcc๋ฅผ ์ง์ํ๊ธฐ๋ฅผ ์ํ์ญ๋๊น?
๋ด ์๊ฐ์ ๋๋ต์ ์์
๋๋ค. ์ปดํ์ผ๋ฌ ์์ฒด๋ VS Community์์ ๋ฌด๋ฃ์ด๋ฉฐ ์์ ํ Windows ์ง์์ด ์๋ ๊ฒ์ ์ ๋ง ์ค๋ง์ค๋ฝ์ต๋๋ค. Windows ๋๊ตฌ ๋ชจ์์ด ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ github.com/Microsoft/hcsshim
๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํด Linux ์์๋ฅผ ์ธ์ธ ํ์๊ฐ ์์ต๋๋ค.
Windows ๋๊ตฌ ๋ชจ์์ ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์์น์ ์ผ๋ก MSVC ๊ฐ์ฒด ํ์ผ์ ์ง์ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฑด์ถ์ฃผ๊ฐ ํ์ํฉ๋๋ค.
๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ Windows ๋๋ MSVC ๋ฆด๋ฆฌ์ค ๊ฐ์ ํ์์ด ์ผ๋ง๋ ๋ณ๊ฒฝ๋ ์ ์๋์ง์ ๋๋ค. ๋๋ถ๋ถ์ ๋ค๋ฅธ ํ๋ซํผ์์ ์ฌ์ฉ๋๋ ELF ํ์์ ๋งค์ฐ ์์ ์ ์ ๋๋ค. ์๋ก์ด ํ๋ก์ธ์์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ ์ธ์๋ ELF ์ง์์ ์กฐ์ ํ ํ์๊ฐ ๊ฑฐ์ ์์ต๋๋ค. MSVC ํ์ผ ํ์๋ ๋น์ทํ๊ฒ ์์ ์ ์ ๋๊น?
MSVC ๋๊ตฌ ์ฒด์ธ๊ณผ ๊ด๋ จ๋ ํ์์ ์๋นํ ์์ ์ ์ ๋๋ค. ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๋๊ตฌ ์์ฒด๋ฅผ ์ง์ํ๋ ๊ฒ์ ๋๋ค. Microsoft๋ Visual Studio ๋ฆด๋ฆฌ์ค ๊ฐ์ ํญ๋ชฉ(ํ์ผ ๋ฐ ๋ ์ง์คํธ๋ฆฌ ํญ๋ชฉ)์ ์ด๋ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด ๋๋ถ๋ถ์ ๊ตฌ์ฑํ ์ ์์ง๋ง(์ ์ด๋ ๋ด๊ฐ ์์ฑํ ํจ์น์์) Visual Studio์ ์ ์ฃผ์ ๋ฒ์ ์ด ๋ฆด๋ฆฌ์ค๋ ๋ Go๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ๋น๋ ๋๊ตฌ ์ฒด์ธ์ผ๋ก ํธํ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์๋๋ ๋ชจ๋ ์ด์ ๋ฒ์ ์ Visual Studio๋ ๊ณ์ ์๋ํฉ๋๋ค.
๋ด๊ฐ ์๋ ํ COFF ํ์์ C ABI(C++์ด ์๋)์๋ง ๋ ธ์ถ๋๋ฉด ํฉ๋ฆฌ์ ์ธ ์์ ์ฑ์ ๊ฐ์ต๋๋ค. ๋ํ ๊ด๋ฒ์ํ๊ฒ ๋ฌธ์ํ๋์ด ์์ผ๋ฉฐ LLVM์ ์ฐธ์กฐ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
@cchamplin ์ฌ์ฉ์๊ฐ MSVC์ ์ฐ๊ฒฐํ๊ธฐ ์ ์ vcvarsall.bat๋ฅผ ํธ์ถํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฑฐ์ 0์ ๊ฐ๊น๊ฒ ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.
๊ฑด์ถ์ฃผ๊ฐ ํ์ํฉ๋๋ค.
@ianlancetaylor MSVC ๊ฐ์ฒด๊ฐ ์๋ํ ๋๋ก ์๋ํ๋ ๊ฒ์ผ๋ก ์ ์ฆ๋๋ฉด msys/cygwin ๋น๋์ MSVC ๋น๋๊ฐ ๋ชจ๋ ํ์ํ๋ค๊ณ ์๊ฐํ์ญ๋๊น? ์๋๋ฉด MSVC ๋น๋๋ง ์์ด์ผ ํฉ๋๊น?
์ผ๋ถ ์ฌ๋๋ค์ cygwin ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ ๊ฒ์ด๋ฉฐ ์ด๋ฏธ ์๋ํ๊ณ ์์ผ๋ฉฐ ๊ณ์ ์๋ํ๊ธฐ๋ฅผ ์ํ๋ฏ๋ก ๋ ๋ช ์ ๋น๋๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์ค๋ ๋์ ๋งจ ์๋์์ ๋ณด๋ฉด MSVC ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ๋ MSVC ํ์ ์์ต๋๋ค. github ๋๋ ์ด๋ฉ์ผ([email protected])์์ ์ ์๊ฒ ํ์ ๋ณด๋ด์ฃผ์ธ์.
๊ฑด์ถ์ฃผ๊ฐ ํ์ํฉ๋๋ค.
์. ๊ทธ๋ฆฌ๊ณ MS ๋น๋ ๋๊ตฌ๊ฐ ์ค์น๋๋๋ก ๊ธฐ์กด ๋น๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฌธ์ ์ ๋ํ CL์ ์๋ฝํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ชจ๋ ๋น๋์ gcc ๋๊ตฌ์ Microsoft ๋๊ตฌ๋ฅผ ๋ชจ๋ ์ค์นํ ์ ์์ต๋๋ค. gcc์ microsoft ๋๊ตฌ๋ฅผ ํ ๋ฒ์ ํ ์คํธํ๋ all.bat๋ฅผ ์คํํ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋๊ตฌ์ ๋ํด ๋ค๋ฅธ ๋น๋๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ฌ์ฉ๋๋ ์ธ๋ถ ์ปดํ์ผ๋ฌ ๋ฐ ๋ง์ปค๋ฅผ ์ ์ดํ๋ โโ๋งค๊ฐ๋ณ์๋ ๋ฌด์์ ๋๊น?
๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ Windows ๋๋ MSVC ๋ฆด๋ฆฌ์ค ๊ฐ์ ํ์์ด ์ผ๋ง๋ ๋ณ๊ฒฝ๋ ์ ์๋์ง์ ๋๋ค.
Windows์ ํจ๊ป ์ปดํ์ผ๋ฌ๊ฐ ์ค์น๋์ง ์์ต๋๋ค. ์ง์ ์ค์นํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ gcc์์ ํ๋ ๊ฒ์ฒ๋ผ. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ ๋ฒ์ ์ ์ค์นํฉ๋๋ค. ๋ค๋ฅธ ๋น๋์์ ๋ค๋ฅธ gcc ๋ฒ์ ์ ์คํํ ์๋ ์์ต๋๋ค.
MSVC ํ์ผ ํ์๋ ๋น์ทํ๊ฒ ์์ ์ ์ ๋๊น?
๋๋ ๊ทธ๊ฒ์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅธ๋ค. ์ ๊ณต๋ ๋๊ตฌ๋ง โโ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ ์ค
๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ Windows ๋๋ MSVC ๋ฆด๋ฆฌ์ค ๊ฐ์ ํ์์ด ์ผ๋ง๋ ๋ณ๊ฒฝ๋ ์ ์๋์ง์ ๋๋ค. ๋๋ถ๋ถ์ ๋ค๋ฅธ ํ๋ซํผ์์ ์ฌ์ฉ๋๋ ELF ํ์์ ๋งค์ฐ ์์ ์ ์ ๋๋ค. ์๋ก์ด ํ๋ก์ธ์์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ ์ธ์๋ ELF ์ง์์ ์กฐ์ ํ ํ์๊ฐ ๊ฑฐ์ ์์ต๋๋ค. MSVC ํ์ผ ํ์๋ ๋น์ทํ๊ฒ ์์ ์ ์ ๋๊น?
์, COFF๋ ๋งค์ฐ ์์ ์ ์ ๋๋ค.
@bradfitz ๋ฐ @ianlancetaylor ์ด ๋ฌธ์ ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ๊ธฐ ์ํด Windows Builder๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฌด์์ด ํ์ํฉ๋๊น? https://github.com/golang/go/issues/20982#issuecomment -370719472์์ ๋ด ์ง๋ฌธ์
๊ฐ์ฌํฉ๋๋ค
์๋ ์ค
์ด์ go๊ฐ msvc ๊ฐ์ฒด๋ฅผ ์ง์ํฉ๋๊น?
https://golang.org/cl/110555 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: debug/pe: parse the import directory correctly
@alexbrainman @bradfitz @ianlancetaylor :
๋๋ ํจ์น๋ฅผ ์ ๋ฆฌํ๊ณ ๋ ์ํํ๊ธฐ ์ฌ์ด ์กฐ๊ฐ์ผ๋ก ๋๋๋ ๋ฐ ํ์ํ ๋๋ถ๋ถ์ ์์ ์ ์ํํ์ต๋๋ค. ํ๋ก์ ํธ์ ์ค์ ์ ์ถํ ์ค๋น๊ฐ ๊ฑฐ์ ์๋ฃ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๋๋ฅผ ์ ์ถํ๊ธฐ ์ ์ ๋น๋ ์ํฉ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋์ง ์๋๋ฉด ์ต๋ํ ๋นจ๋ฆฌ ํด์ผ ํ๋์ง ์์์ผ ํฉ๋๋ค.
์ธ์ ๋ ์ง CL์ ๋ณด๋ผ ์ ์์ง๋ง ๋๊ตฐ๊ฐ ๋น๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ ์คํธํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
@johnsonj , Windows ์ด๋ฏธ์ง์ MSVC ์ปดํ์ผ๋ฌ ๋๊ตฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๊น?
์ด์์ ์ผ๋ก๋ ์ ํธ์คํธ ์ ํ์ ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด Windows ํธ์คํธ ์ ํ ์ค 1-3๊ฐ์ Cygwin ์ธ์ MSVC ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ ๋ ํธ์คํธ ์ ํ ์์ ๋ ๋ง์ ๋น๋ ๊ตฌ์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
/cc @andybons @bcmills as FYI (Windows ์ผ์ด ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง... Jeff์๊ฒ ๋์์ ์์ฒญํฉ๋๋ค :))
@johnsonj , Windows ์ด๋ฏธ์ง์ MSVC ์ปดํ์ผ๋ฌ ๋๊ตฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๊น?
@cchamplin ๋น๋์ ํ์ํ ๋ชจ๋ ๋๊ตฌ๋ฅผ ์ง์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ์์ง๋ง ๋ฌด์์ด ํ์ํ์ง ์๊ณ ์์ต๋๋ค. ์ ์ฒด ์ง์นจ์ golang.org/x/build/env/windows ๋๋ ํ ๋ฆฌ์์ ํ์ธํ ์ ์์ต๋๋ค. ํนํ startup.ps1์ ์ค์ ๋ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค. ํด๋น ๋๋ ํฐ์์ ๋ณ๊ฒฝํด์ผ ํ ์ฌํญ์ ์๊ฒ ๋๋ฉด https://golang.org/doc/contribute.html์ ํตํด ๋ณ๊ฒฝํ๊ณ ๊ฒํ ๋ฅผ ์ํด ๋ณ๊ฒฝ ์ฌํญ์ ๋ณด๋ด๋ฉด ์น์ธ๋๋ฉด ์ด ์ง์นจ์ ์ฌ์ฉํ์ฌ ๋น๋๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์ด์์ ์ผ๋ก๋ ์ ํธ์คํธ ์ ํ์ ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด Windows ํธ์คํธ ์ ํ ์ค 1-3๊ฐ์ Cygwin ์ธ์ MSVC ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ ๋ ํธ์คํธ ์ ํ ์์ ๋ ๋ง์ ๋น๋ ๊ตฌ์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
Windows์๋ ํญ์ Mingw(gcc) C ์ปดํ์ผ๋ฌ์ ๋ง์ปค๊ฐ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ C ๋น๋ ๋๊ตฌ ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. Microsoft C ์ปดํ์ผ๋ฌ์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ฉด all.bat๋ฅผ ํ ๋ฒ๋ง ์คํํ์ฌ Mingw ๋ฐ Microsoft C ๊ธฐ๋ฅ์ ๋ชจ๋ ํ ์คํธํ ์ ์์ต๋๊น? ์๋๋ฉด Mingw ๋๋ Microsoft C๊ฐ ์๋ก๋ฅผ ์ ์ธํฉ๋๊น? Mingw ๋๋ Microsoft๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ผ๋ถ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๊น? ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๊ณ ํ ์คํธ๋์ด์ผ ํ๋์ง ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ํ ์ด๊ฒ์ ์ผ๋ง๋ ๋ง์ ๋ค๋ฅธ ๋น๋๊ฐ ํ์ํ์ง๋ฅผ ๊ฒฐ์ ํ ๊ฒ์ ๋๋ค.
์๋ ์ค
์ด๋ฏธ์ง์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ตฝ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
https://golang.org/cl/112036 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: env/windows: add visual studio tools to image
@johnsonj @bradfitz : ๋น๋์ ๋ฃ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@alexbrainman @bradfitz @ianlancetaylor : ์ด์ ๋ํ ํ ์คํธ ์ ๋ต์ ๊ดํด์๋ ์ ํํ ๋ฌด์์ ์ ํํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฐฝ์์ ๋ ๋๊ตฌ ๋ชจ์์ ๋ํด dist ํ ์คํธ๋ฅผ ์คํํ๊ณ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์ํํ ์ ์์ต๋๋ค. ์๋๋ฉด cgo ํ ์คํธ๋ฅผ ๋ ๋ฒ(gcc์ ํ ๋ฒ, msvc์ ํ ๋ฒ)๋ง ํ ์คํธํด์ผ ํฉ๋๊น?
๊ทธ๋์ ์ด๊ฒ์ ๋ํ ํ ์คํธ ์ ๋ต์ ๊ดํด์๋ ์ ํํ ๋ฌด์์ ํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฐฝ์์ ๋ ๋๊ตฌ ๋ชจ์์ ๋ํด dist ํ ์คํธ๋ฅผ ์คํํ๊ณ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์ํํ ์ ์์ต๋๋ค. ์๋๋ฉด cgo ํ ์คํธ๋ฅผ ๋ ๋ฒ(gcc์ ํ ๋ฒ, msvc์ ํ ๋ฒ)๋ง ํ ์คํธํด์ผ ํฉ๋๊น?
@cchamplin ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์์ต๋๋ค. Ian์ด ๋ต์ ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ ์ค
cgo ๋์ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์คํํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ์ผ๋ง์ ๋๊น?
@mxplusb , Windows์ฉ ์ ๋น๋ ๊ตฌ์ฑ์ ์คํํ ์ ์์ผ๋ฉฐ ๊ธฐ์กด 3๊ณผ ๋ณ๋ ฌ๋ก ์คํ๋ฉ๋๋ค. ์ ๋น๋ ๊ตฌ์ฑ์ ๊ด์ฐฎ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ๊ธฐ์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
๋ค๋ฅด๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ญ์์ค. ๋ค๋ฅธ/์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋ฉด ๋ฌด์ธ๊ฐ๊ฐ ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด ์์ ์ ์ํํ๋ ค๋ฉด ๋ช ๊ฐ์ง ์์ ์ด ํ์ํ ๊ฒ์ ๋๋ค.
์ ์ ํ vsvars.bat๊ฐ ์คํ/ํธ์ถ๋ ํ dist ํ ์คํธ๊ฐ ์คํ๋๋ go ํ ์คํธ๊ฐ ๋ด๋ถ์์ ์คํ๋ ์ ธ/ํ๊ฒฝ์์ ๋ด๋ถ๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
๋๋ dist๊ฐ ์ ์ ํ vsvar๋ฅผ ์คํํ๊ณ ํ์ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ์ถํ ๋ค์ ํ ์คํธ๋ฅผ ์ํด ์ค์ /์ ๋ฌํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ํ dist ๋๋ make.bat์ -compiler msvc ์ธํธ๋ก ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ถ๋ค๊ณ ์๋ ค์ฃผ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
์ ์ ํ vsvars.bat๊ฐ ์คํ/ํธ์ถ๋ ํ dist ํ ์คํธ๊ฐ ์คํ๋๋ go ํ ์คํธ๊ฐ ๋ด๋ถ์์ ์คํ๋ ์ ธ/ํ๊ฒฝ์์ ๋ด๋ถ๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
๋๋ dist๊ฐ ์ ์ ํ vsvar๋ฅผ ์คํํ๊ณ ํ์ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ์ถํ ๋ค์ ํ ์คํธ๋ฅผ ์ํด ์ค์ /์ ๋ฌํ๋๋ก ํ ์ ์์ต๋๋ค.
dist.exe ๋๋ go.exe์์ ๋ฐฐ์น ํ์ผ์ ์คํํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐฐ์น ํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค.
๋ํ dist ๋๋ make.bat์ -compiler msvc ์ธํธ๋ก ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ถ๋ค๊ณ ์๋ ค์ฃผ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
Ian์ด ์ฌ๊ธฐ์์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ์๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค. ๋ด๊ฐ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ฐ๋ฆฌ๋ Unix์์๋ ๋ค์ํ C ์ปดํ์ผ๋ฌ(gcc ๋๋ clang)๋ฅผ ์ง์ํฉ๋๋ค. ํ์คํ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ๋ค์ํ C ์ปดํ์ผ๋ฌ๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
์๋ ์ค
go build -compiler msvc
๋ฅผ) ์ฌ์ฉํ ๊ณํ์ด๋ผ๋ ๊ฒ์ ์ ์๋ ์์ง ๋ชปํ์ต๋๋ค. ๋ง์ด ์ ๋ฉ๋๋ค. go build -compiler
์ต์
์ Go ์ปดํ์ผ๋ฌ(ํ์ฌ gc ๋๋ gccgo)์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. C ์ปดํ์ผ๋ฌ์ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. C ์ปดํ์ผ๋ฌ๋ CC
ํ๊ฒฝ ๋ณ์์ ์ ๋ฌ๋ฉ๋๋ค. ๊ธฐ๋ณธ C ์ปดํ์ผ๋ฌ๋ make.bat์ ์ฃผ์์ ์ค๋ช
๋ ๋๋ก make.bat๋ฅผ ์คํํ ๋ CC_FOR_TARGET
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์ค์ ๋ฉ๋๋ค.
all.bat๋ฅผ ์คํํ๊ธฐ ์ ์ CC_FOR_TARGET
ํ๊ฒฝ ๋ณ์๋ฅผ msvc๋ก ์ค์ ํ๋ ๋น๋๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ผ์ ํด์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
C ์ปดํ์ผ๋ฌ๋ CC ํ๊ฒฝ ๋ณ์์ ์ ๋ฌ๋ฉ๋๋ค. ๊ธฐ๋ณธ C ์ปดํ์ผ๋ฌ๋ make.bat์ ์ฃผ์์ ์ค๋ช ๋ ๋๋ก make.bat๋ฅผ ์คํํ ๋ CC_FOR_TARGET ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์ค์ ๋ฉ๋๋ค.
์ค๋ช ํด์ฃผ์ Ian๋ ๊ฐ์ฌํฉ๋๋ค.
@cchamplin ๊ธฐ์กด ๋ชจ๋ธ์ ๋ง๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ์กฐ์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ๊ฐ์ฌํฉ๋๋ค.
all.bat๋ฅผ ์คํํ๊ธฐ ์ ์ CC_FOR_TARGET ํ๊ฒฝ ๋ณ์๋ฅผ msvc๋ก ์ค์ ํ๋ ๋น๋๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
https://build.golang.org ์ 3๊ฐ์ amd64 ์๋์ฐ ๋น๋๊ฐ
์๋ ์ค
@ianlancetaylor @alexbrainman -compiler ํ๋๊ทธ์ ๋ํด ์ดํดํ์ต๋๋ค. CC="msvc"
(๋๋ ์ค์ ๋ก CC="cl.exe"
)๋ฅผ ์๋ํ๋๋ก ์ค์ ํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. CC๋ ์ฌ์ ํ MSVC ๋น๋๊ฐ ์๋ํ๋ ค๋ฉด GCC ์์น๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํฉ๋๋ค. msvc ์ปดํ์ผ๋ฌ ๋๊ตฌ ์งํฉ์๋ CGO๊ฐ ํ์ํ ์์ฒด ๊ฒ์ฌ(์ ์ ์กฐํ, ์ ํ ํ์ธ)๋ฅผ ์ํํ ์ ์๋ ๋๊ตฌ๊ฐ ์์ผ๋ฏ๋ก GCC๋ MSVC ๋น๋์ ์ฌ์ ํ ํ์ํ๋ฉฐ GCC๋ ์ค์ ์ปดํ์ผ/์ฐ๊ฒฐ ๋จ๊ณ์์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
๋น๋ ๋ฑ์ ์ํด ์ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ชจ๋ ํ์ฉ๋ฉ๋๊น(๋๊ตฌ ์ฒด์ธ ๋๋ ๊ธฐํ)? ๋๋ ์ด๋ฏธ cgo์ ํด์ฒด์ธ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
๋ํ all.bat ์ ์ CC_FOR_TARGET
๋ฅผ ์ค์ ํ๋ฉด ๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉ๋๋ ์ปดํ์ผ๋ฌ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋ถ์ ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค. ๋ถํธ์คํธ๋ฉ ํ๋ก์ธ์ค ์ค์ MSVC๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
MSVC์ ๊ฒฝ์ฐ GCC์ MSVC๊ฐ ๋ชจ๋ ์์ด์ผ ํฉ๋๊น? Cgo ๋๊ตฌ์์๋ง GCC๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์ ์ด๋์ ๋๊น? ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ํํ ๋์ผํ ABI๋ฅผ ๊ตฌํํ๋ GCC์ MSVC์ ์ ๋์ ์ผ๋ก ์์กดํ๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ถํํด ๋ณด์ด์ง๋ง, ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ์๋นํ ๋์ต๋๋ค.
GCC๋ก ์ค์ ํ ์ ์๋ ๋ ๋ค๋ฅธ ํ๊ฒฝ ๋ณ์ CC_FOR_CGO
๋ฅผ ์ถ๊ฐํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
make.bat์์ ์ฌ์ฉํ๋ CC_FOR_TARGET
๋ ๋ฐํ์/cgo๋ฅผ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐํ์/cgo๊ฐ ์ฌ์ฉ ์ค์ธ C ์ปดํ์ผ๋ฌ์ ์ํด ๋น๋๋์ง ์์ ๊ฒฝ์ฐ cgo๊ฐ ์ด๋ป๊ฒ ์๋ํ ์ ์๋์ง ๋์๊ฒ๋ ๋ช
ํํ์ง ์์ต๋๋ค.
์๋ง๋ CC_FOR_TARGET
๋ฅผ cl
ํ๊ณ CGO_ENABLED
๋ฅผ 0
์ค์ ํ๋ make.bat ๊ฐ ํธ์ถ๋ ๋ ์ผ์ ์์ํด์ผ ํ ๊ฒ์
๋๋ค.
@ianlancetailor ๊ฐ์ฌ
MSVC์ ๊ฒฝ์ฐ GCC์ MSVC๊ฐ ๋ชจ๋ ์์ด์ผ ํฉ๋๊น? Cgo ๋๊ตฌ์์๋ง GCC๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์ ์ด๋์ ๋๊น? ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ํํ ๋์ผํ ABI๋ฅผ ๊ตฌํํ๋ GCC์ MSVC์ ์ ๋์ ์ผ๋ก ์์กดํ๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ถํํด ๋ณด์ด์ง๋ง, ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ์๋นํ ๋์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ถํํ๋ค๋ ๋ฐ ๋์ํ๊ณ ์ด๋ค ๋์์ ๋ฐฐ์ฐ๊ฒ ๋์ด ๊ธฐ์ ๊ฒ์ ๋๋ค. ์์ง ์ฐพ์ง ๋ชปํ์ต๋๋ค. ํ์คํ ์ด๋ฐ ์์ผ๋ก ๋น๋ํ ์ํ์ด ์์ต๋๋ค(์: ๋น๋๋๋ cgo ์ฝ๋๋ ๋น๋๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ ์ปดํ์ผ๋ฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ํ def ๋๋ ์ ์๋ฅผ ๊ฐ์ต๋๋ค). ๋ฐ๋ผ์ ๋น๋๊ฐ ์ฝ๊ฐ์ ์กฐ์ ์์ด๋ ํญ์ ์ฑ๊ณตํ๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์์ ์ ์์ต๋๋ค(๋ด ๊ตฌํ์์ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ด ์์ง๋ง ์ฝ๊ฐ์ ์๋ ํ๋ก์ธ์ค์). ์ฌํ๊ฒ๋ ์ด๊ฒ์ ์ฌ๋๋ค์ด MSVC ๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๊ฐ์ํด์ผ ํ๋ ์ํ์ด๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ํ ์ ์๋ ์ผ์ ๋ฌธ์ํํ๋ ๊ฒ๋ฟ์ ๋๋ค.
๋น์ทํ ์ฐธ๊ณ ๋ก MSVC ์ปดํ์ผ๋ฌ๊ฐ c99์ ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ MSVC ๋น๋ cgo ํ๋ก๊ทธ๋จ์์ complex64 ๋ฐ complex128 ์ง์์ ์ ๊ณตํ๊ธฐ ์ํ ์ค์ ๊ฒฝ๋ก๋ ์์ง ์์ต๋๋ค.
GCC๋ก ์ค์ ํ ์ ์๋ ๋ ๋ค๋ฅธ ํ๊ฒฝ ๋ณ์
CC_FOR_CGO
๋ฅผ ์ถ๊ฐํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ํ์ฌ ๊ตฌํ์ go build๊ฐ MSVC๋ก ๋น๋ํ๋๋ก ์ง์๋ฐ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฝ๋ก์์ cl.exe๋ฅผ ์ฐพ์ง๋ง ํ๊ฒฝ ๋ณ์ MSCC๋ก ์ฌ์ ์ํ ์ ์์ต๋๋ค. CGO๋ ์์ฑ๋ zdefaultcc.go์ ์๋ gcc/๋ฌด์์ด๋ ๋ค์ CC ํ๊ฒฝ ๋ณ์๋ฅผ ๊ณ์ ์ฌ์ฉํฉ๋๋ค.
make.bat์์ ์ฌ์ฉํ๋
CC_FOR_TARGET
๋ ๋ฐํ์/cgo๋ฅผ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐํ์/cgo๊ฐ ์ฌ์ฉ ์ค์ธ C ์ปดํ์ผ๋ฌ์ ์ํด ๋น๋๋์ง ์์ ๊ฒฝ์ฐ cgo๊ฐ ์ด๋ป๊ฒ ์๋ํ ์ ์๋์ง ๋์๊ฒ๋ ๋ช ํํ์ง ์์ต๋๋ค.
ํ์ฌ ๊ตฌํ์์ cgo๋ ์ ์ฒด go ๋๊ตฌ ์ฒด์ธ์ด gcc์ ์ํด ๊ตฌ์ถ๋ ๊ฒฝ์ฐ์๋ msvc ๋ฐ์ด๋๋ฆฌ์ ๋ํด ํ๋ณตํ๊ฒ ์๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด MSVC ์ฝ๋๊ฐ go/src์ ์ถ๊ฐ๋ฉ๋๋ค. all.bat๋ gcc๋ฅผ ์ฌ์ฉํ์ฌ go ํ๊ฒฝ์ ๊ตฌ์ถํ๋ฉด์ ์คํ๋ฉ๋๋ค. ๊ทธ ํ go/bin/go.exe๋ฅผ ์ฌ์ฉํ์ฌ msvc ๋๊ตฌ ์ฒด์ธ์ผ๋ก ๋น๋ํ ์ ์์ต๋๋ค(ํ๋๊ทธ๊ฐ ์ ๊ณต๋๋ค๊ณ ๊ฐ์ ). ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ฌด์จ ๋ง์์ ํ์๋์ง ์ ๊ฐ ์คํดํ ์๋ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ msvc๋ก ๋น๋ํ๊ณ ์ถ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์ปดํ์ผ๋ฌ๋ฅผ cl๋ก ์ ํํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ํ ๋ณต์ก์ฑ. MSVC ๋๊ตฌ ์ฒด์ธ์ gcc ๋๊ตฌ ์ฒด์ธ๊ณผ ๋งค์ฐ ๋ค๋ฆ
๋๋ค. MSVC์์๋ vcvars.bat ๋ด์์ ์คํ์ ํตํด ํ๊ฒฝ์ ์ค์ ํด์ผ ํฉ๋๋ค. ํ๋ก์ธ์ค). MSVC ํ๊ฒฝ์ ๋ค์ด๊ฐ ํ ์ฃผ์ ์ฐจ์ด์ ์ ๋๊ตฌ ์์ฒด๊ฐ ๋ฉ๋๋ค. cl.exe๋ C ๋ฐ C++ ํ์ผ์ ์ปดํ์ผํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ml.exe์ ml64.exe๋ ํ์ผ์ ์ด์
๋ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ๋ง์ง๋ง์ผ๋ก link.exe(ms)๋ ๋ค์ ์์
์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ชจ๋ ๊ฒ์ ํจ๊ป ์ฐ๊ฒฐํ์ญ์์ค. ๋ฐ๋ผ์ CC=cl.exe
์ค์ ํ๊ณ ์ฌ๋ฐ๋ฅธ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ๋ ๊ฒ ์ด์์
๋๋ค. ๊ทธ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๊น/์ค๋ช
ํ๋ ๋ฐ ๋์์ด๋ฉ๋๊น?
์ ๋ํด ๋ ๋ช ํํ ํ๊ธฐ ์ํด
make.bat์์ ์ฌ์ฉํ๋ CC_FOR_TARGET์ ๋ฐํ์/cgo๋ฅผ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐํ์/cgo๊ฐ ์ฌ์ฉ ์ค์ธ C ์ปดํ์ผ๋ฌ์ ์ํด ๋น๋๋์ง ์์ ๊ฒฝ์ฐ cgo๊ฐ ์ด๋ป๊ฒ ์๋ํ ์ ์๋์ง ๋์๊ฒ๋ ๋ช ํํ์ง ์์ต๋๋ค.
go build
๋ ๋น๋ ํ๋ก์ธ์ค ์ค ๋ฐํ์/cgo์์ ์ ์ ํ ํ์ผ์ ์ ํํ๊ณ ์์ต๋๋ค(์: go build
/ go test
/ go run
-- ๋น๋ ํ๋ก์ธ์ค ์๋). msvc ๋๊ตฌ ๋ชจ์์ด ์ ํ๋์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง์ ๋ํ ์ ์์ ์ด๋ ค ์์ง๋ง go ๋๊ตฌ์ ๋ํ ์๋ก์ด ๋ช ๋ น์ค ์ต์ ์ด ํ์ํ์ง ์์์ผ ํฉ๋๋ค. go ๋๊ตฌ์ ๊ดํ ํ GCC์ฒ๋ผ ์๋ํ์ง๋ง ์ค์ ๋ก MSVC๋ฅผ ์คํํ๋ ์์ํ Go ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๊น?
go ๋๊ตฌ์ ๊ดํ ํ GCC์ฒ๋ผ ์๋ํ์ง๋ง ์ค์ ๋ก MSVC๋ฅผ ์คํํ๋ ์์ํ Go ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๊น?
๋๋ ๊ทธ๊ฒ์ด ์คํ ๊ฐ๋ฅํ๋ค๊ณ ๋ฏฟ๋๋ค. ๋ด๊ฐ ๊ทธ ๊ธธ์์ ๋ญ๊ฐ๋ฅผ ์ป์ ์ ์๋์ง ๋ณด์.
๋ํ ๋ค๋ฅธ ๋๊ตฌ์ ๋ช ๋ น์ค ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ธ์ง ๋ช ํํ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ์ด์ ๋ํ ํฌ๊ด์ ์ธ ํจ์น๋ ๋ค์ํ ๋๊ตฌ์์ ๋ช ๊ฐ์ง ์๋ก์ด ๋ช ๋ น์ค ํ๋๊ทธ๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค.
๋ํ ๋ค์ ๋น๋ ์ต์ /cgo ํ๊ฒฝ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค.
MSCXX
MSCC
MSCFLAGS
MSCPPFLAGS
MSCXXFLAGS
MSLDFLAGS
๋ช ๋ถ ๋์ ์๊ฐํ ํ์ ์ปดํ์ผ๋ฌ ๋ช ๋ น์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ํจ๊ป ์๊ฐํ๋ ๊ฒฝ์ฐ ๊ทน๋ณตํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ ๋ช ๊ฐ์ง ์ฅ์ ๋ฌผ์ด ์์ต๋๋ค.
go build
๋ ๋น๋ํ ๋ฐํ์/cgo ํ์ผ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ธ๋ถ ๋๊ตฌ ์ฒด์ธ์ด ๋ฌด์์ธ์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํธํ๋์ง ์๋ gcc ๋ฒ์ ์ ํ๋ก์ ๋ช
๋ น์ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค. ํ๋ก์ ์์ฒด ๋ด๋ถ์์ ์ด ๋ฌธ์ ๋ฅผ ํดํนํ ์ ์์ง๋ง ๋ฐํ์/cgo์ ์ถ๊ฐ ํ์ผ์ด ์ถ๊ฐ๋๋ฉด ๋ถ์์ง๊ธฐ ์ฝ๊ณ ๊นจ์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.go build
๋ cmd/link๋ฅผ ํธ์ถํ์ฌ .bss์์ .data ์ฌ๋ฐฐ์น๋ฅผ ์ํํ๊ณ ๋ง์ปค์ ํน์ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ ์ ์๋๋ก ๋๊ตฌ ์ฒด์ธ์ ์์์ผ ํฉ๋๋ค(ํ์๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํ๋ก์ ์์ฒด์ ์ผ๋ถ)go build
์ฌ์ฉํ๋๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ์ง์ ํ๋ฉด msvc ๋น๋๊ฐ ์๋ํฉ๋๊น? msvc๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๋น๋ํ๋ ค๋ ์ฌ๋์๊ฒ๋ ๊ธฐ์ค์ ๋ ๋๊ฒ ์ค์ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ด์ vsvars.bat ๋ด๋ถ์์ ์คํํ๋ ๊ฒ ์ธ์๋ ์ฌ๋ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค(์ต์ CC
๋ฐ UNDECIDED_TURN_ON_MSVC_BUILD_VAR
)
๋ ๋ค๋ฅธ ๋์์ go build
๊ฐ ์ง์ ๋ CC
์์ ๊ฐ์ง noop ๋ช
๋ น์ ์คํํ ๋ค์ ๋ก๊ณ /ํค๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ msvc ๋๋ gcc์ธ์ง ๊ฐ์งํ๊ณ ํด๋น ์ง์ ์์ ์ ์ ํ ๋๊ตฌ ๋ชจ์ ์กฐ์ ์ ์งํํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. ...์ด๊ฒ์ด ์ผ๋ง๋ ๋ถ์์ง๊ธฐ ์ฌ์ด์ง ๋๋ clang๊ณผ ๊ฐ์ msvc ํธํ ๋๊ตฌ ๋ชจ์๊ณผ ํจ๊ป ์๋ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ต๊ทผ์ ์ด Github ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ด ์์ ์ ์ ์๊ฒ ๋งค์ฐ ํฅ๋ฏธ์ง์งํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ฐ๊น์ด ์ฅ๋์ ์ด๋๊ฐ์ ์ฐฉ๋ฅํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด ์๋๋ Windows์์ CGo๋ฅผ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๋ ์ผ๋ถ ํ์ฌ ์ฝ๋์ ๋ํ ๋ํผ๋ก ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. mingw-w64
์ฌ์ฉํ์ฌ ์์ค์์ ๋ค์ ๋น๋ํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํตํด ์คํํ ๋น๊ต์ ์ฌ๊ฐํ ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฏ๋ก ๊ฝค ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
์ฌํํผ @cchamplin ๊ณผ ์ด ์์ ์ ํ๊ณ ์๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๊ฐ์ฌ๋ฅผ
@cchamplin Windows ๋ฐ cgo์ ์ปดํ์ผ๋ฌ ๋๊ตฌ ์ฒด์ธ์ ๋ํด ๋ด๊ฐ ๋์ธ ์ ์๋ ์ํ์ ๋ํด ์ถฉ๋ถํ ์๊ณ ์์ต๋๋ค. ๋น์ ์ด ์์ ์ค ์ผ๋ถ์ ๋๋ฅผ ๋ฐ๋ผ ์ก์ ์ ์์ต๋๊น? ๋ด๊ฐ ๋ฌด์์ ๋์ธ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ๋๋ ์ ์ค ์ผ์ด์ค @deadprogram ์๊ณ ์๋ค ์ฐ๋ฆฌ๊ฐ ์ํ์ ์ค๋น๊ฐ๋๋ฉด ๋ด๊ฐ ์ข์ ๊ณ ๊ธ ํ ์คํธ ๋ฒ ๋ ๊ทธ๋์.
์๋ ํ์ธ์ @mxplusb , ํจ์น๋ ์ค์ ๋ก ์ด๋ ์ ๋ ์ค๋น๊ฐ ๋์์ต๋๋ค. ์๊ฐ์ ์ฐพ์ ์ ์๋ค๋ฉด ์ค๋ ๋ฐค์ด๋ ๋ด์ผ gerrit์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ถํ์ฌ ๋ชจ๋ ๊ฒํ , ์ ๋ฐ์ดํธ ๋ฐ ์น์ธ์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
https://golang.org/cl/133937 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/link: Add flag rlocbss to relocate .bss data to .data
https://golang.org/cl/133938 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: runtime/cgo: MSVC toolchain support in cgo native code
https://golang.org/cl/133939 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/cgo: Add toolchain flag to cgo command for MSVC support
https://golang.org/cl/133946 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/compile: Add support for MSVC toolchain to go build
์ผ๋ถ ์ปค๋ฐ์ ๋ฌธ์ ๋ฅผ ์ ๋ ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒํ ํ๋ก์ธ์ค๋ฅผ ์งํํ๊ณ ๊ฐ์ฅ ์ข์ ์์ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
https://golang.org/cl/133943 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/cgo: Add support for CC_FOR_CGO environment variable
https://golang.org/cl/133942 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: tests: Update various tests to prepare for MSVC compiler toolchain
https://golang.org/cl/133940 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ: misc/cgo: Adjust tests to be compatible with MSVC toolchain support
https://golang.org/cl/133941 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: runtime: Add runtime.CompilerType to denote between host compiler type
๋ณ๊ฒฝ https://golang.org/cl/133945 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธํฉ๋๋ค. cmd/link: Add external toolchain support for MSVC
https://golang.org/cl/133944 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/compile, cgo: Add support for MSVC flags
@cchamplin ์ต์ข ๊ฒฐ์ ์ด ๋ฌด์์ธ์ง ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? MSVC ์ง์์ ์ด๋ป๊ฒ ๋ฉ๋๊น? ์ด๋ค ๋ช ๋ น์ค ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋ฉ๋๊น? ์ฌ์ฉ์๋ MSVC๋ฅผ ๋ค์ด๋ก๋ํ๋ ๊ฒ ์ธ์ ํ๊ฒฝ์์ ๋ฌด์์ ํด์ผ ํฉ๋๊น? ๊ฐ์ฌ ํด์
๋ํ ์ด ํจ์น๋ฅผ ์ด๋ป๊ฒ ์๋ํ ์ ์์ต๋๊น? ์ ์ฅ์์์ ์ปค๋ฐ์ ์ฐพ์ ์ ์์ต๋๋ค.
@rasky ๋ณ๊ฒฝ ์ฌํญ์ด ๊ฒํ ๋ฅผ ๊ฑฐ์น๋ฉด์ ์ฌ์ ํ ์ฝ๊ฐ์ ์ ๋์ ์ ๋๋ค. CC ํ๊ฒฝ ๋ณ์๊ฐ MSVC๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋ CC๊ฐ ์ค์ ๋์ง ์๊ณ cl.exe๊ฐ ๊ฒฝ๋ก์ ์์ง๋ง gcc๊ฐ ์๋ cgo ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ถํ๊ธฐ๋ง ํ๋ฉด ์ค์ ํด์ผ ํ๋ ํน์ ๋ช ๋ น์ค ํ๋๊ทธ๊ฐ ์์ ๊ฒ์ ๋๋ค.
@blizzardplus ์์ ์ ์ฌํ๊ฒ ํ์ฌ ๋ฆฌ๋ทฐ์ ํจ๊ป ๋ง์ ๋ณํ๊ฐ
@cchamplin ์ gcc
๋๋ clang
์ฌ์ฉํ์ฌ ํฌ๋ก์ค ์ปดํ์ผ์ ์ง์ํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ํ
์คํธ๋ฅผ ๋ฐ์ต๋๊น?
@cchamplin 9/11 ์ดํ CL์ ๋ํ ํ๋์ด ๋ณด์ด์ง ์์ต๋๋ค. ์ด์ ๋ํ ์งํ ์ํฉ์ด ์์ต๋๊น? ์๋๋ฉด ์ถ๊ฐ ๋ฆฌ์์ค๊ฐ ํ์ํ๊ฐ์?
@cchamplin ์ด c-archive์์ ์๋ํ๋ ค๋ฉด ctors ์น์ ์ .CRT$XCU(https://msdn.microsoft.com/en-us/library/bb918180.aspx)๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. golang ๋ฐํ์์ด ์ด๊ธฐํ๋์ง ์์ต๋๋ค. ๋ํ ์ด๊ฒ์ ์ค์ ํ๋ฉด gcc์์๋ ์ ์๋ํ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. gcc๋ ์ฌ์ ํ ํด๋น ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ ํ ์คํธ ์น์ ์ผ๋ก ์ด๋ํ๊ณ ์ค์ main๋ณด๋ค ๋จผ์ ํธ์ถํ๋๋ก main์ ์์ ํฉ๋๋ค. Visual Studio๋ .a ์์นด์ด๋ธ ํ์ผ์ ์ดํดํ ์ ์์ผ๋ฉฐ ์ฌ์ ์ปดํ์ผ/์ด์ ๋ธ๋ ํ์ผ์ ์ธํฐํ์ด์ค๊ฐ C์ด๋ฏ๋ก ์์นด์ด๋ธ์ ์๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. 2๊ฐ์ .text ์น์ ์ ๋ํ ๊ฒฝ๊ณ ๊ฐ ์์ง๋ง ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค(๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ ๋ง์ ํ ์คํธ๊ฐ ํ์ํจ).
๋ํ ์ด๊ฒ์ด c-shared์์ ์๋ํ๋ ค๋ฉด ๋ด๋ณด๋ผ ํจ์๋ฅผ __declspec(dllexport)๋ก ๋ฐ์ฝ๋ ์ดํธํด์ผ ํ์ง๋ง //export์ ํ์ฅ์ด ์ด๋์์ ๋ฐ์ํ๋์ง ์ฐพ์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@blizzardplus clang-MSVC๋ฅผ ์ง์ํ๊ธฐ ์ํ ํ์ ํจ์น๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํฌ๋ก์ค ์ปดํ์ผ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. Windows๊ฐ ์๋ ์์คํ ์์๋ MSVC ๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ํฌ๋ก์ค ์ปดํ์ผ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ๋์ง ์์์ผ ํฉ๋๋ค.
@kshelton ๋ถํํ๋ ์ง๊ธ์ ์ ๊ฐ ๋ฐํํ๋ ์์ ๊ณผ ํ์์ ๋ค๋ฅธ ํ๋ก์ ํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ ์ค ๋งค์ฐ ๋ฐ์ ์๊ธฐ์ ๋๋ค. 12์๊น์ง ํจ์น์ ํ์ํ ๋ฆฌํฉํ ๋ง์ ๋ค์ ์์ํ์ง ๋ชปํ ์๋ ์์ต๋๋ค.
@kshelton ๊ฐ์ฌํฉ๋๋ค. ํจ์น๋ฅผ ๋ค์ ํ์ธํ์ง ์์์ต๋๋ค. c-archive๊ฐ MSVC์์ ์๋ํ์ง ์๊ฑฐ๋ ํน๋ณํ ๋นํ์ฑํํ๋ค๋ ๊ฐ์ ํ์ ๊ฐ๋ฐํ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค. Windows์์ ํ๋ฌ๊ทธ์ธ/๊ณต์ ์์ ์ ์ํํ๋ ค๊ณ ํ ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ์ ํ๊ฒ ์ฅ์ํ๋ ค๊ณ ํ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ์ต๋๋ค. ๋ด๊ฐ ๋ฏฟ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ง๋ง ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ณํฉํ ์ ์์ต๋๋ค. ๊ณต์ ์ฝ๋๋ฅผ ELF ๋ Windows .edata, idata ๋ฐ EAT์ ๋ํด PLT/GOT์ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ์ค์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์ง๋ฉดํ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ์ฌ๋ฐฐ์น์ ์์ ์ ์ํํ ์ ์๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๊ฒ์ด์์ต๋๋ค. ๋๊ตฌ๋ ์ง ์ด๊ฒ์ ๋ํ ํต์ฐฐ๋ ฅ์ด ์๋ค๋ฉด ๊ทธ๊ฒ์ ํ๋ฅญํ ๊ฒ์ ๋๋ค. #19282 ์ฐธ์กฐ
@cchamplin CL ์์ Go๋ฅผ ๋น๋ํ ์ ์๋์ง ํ์ธํ๋ ค๊ณ ํ์ต๋๋ค.
https://go-review.googlesource.com/c/go/+/133946/3
์ด ๋ฐฐ์น ํ์ผ์ ์ฌ์ฉํ์ฌ ํ๊ฒฝ์ ์ค์ ํ์ต๋๋ค.
set TERM=msys
set MYHOME=c:\users\alex\dev
set GOROOT=%MYHOME%\go
set GOROOT_BOOTSTRAP=%MYHOME%\go1.4.3
set GOPATH=%MYHOME%
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
set CC=cl
set PATH=%PATH%;%MYHOME%\my\bin\;%GOROOT%\bin
cd %GOROOT%\src
CMD
make.bat๋ฅผ ์คํํ ๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
C:\Users\Alex\Desktop>set TERM=msys
C:\Users\Alex\Desktop>set MYHOME=c:\users\alex\dev
C:\Users\Alex\Desktop>set GOROOT=c:\users\alex\dev\go
C:\Users\Alex\Desktop>set GOROOT_BOOTSTRAP=c:\users\alex\dev\go1.4.3
C:\Users\Alex\Desktop>set GOPATH=c:\users\alex\dev
C:\Users\Alex\Desktop>call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0.26730.12
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
Microsoft Windows [Version 10.0.17134.407]
(c) 2018 Microsoft Corporation. All rights reserved.
c:\Users\Alex\dev\go\src>make
Building Go cmd/dist using c:\users\alex\dev\go1.4.3
go tool dist: cannot invoke C compiler "cl": exit status 2
Go needs a system C compiler for use with cgo.
To set a C compiler, set CC=the-compiler.
To disable cgo, set CGO_ENABLED=0.
Command output:
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25507.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line warning D9002 : ignoring unknown option '--help'
cl : Command line error D8003 : missing source filename
The system cannot find the batch label specified - fail
c:\Users\Alex\dev\go\src>
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
@alexbrainman
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
์ต์ํ CC_FOR_CGO=gcc๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ํ ๊ฐ์ธ์ ์ผ๋ก MSVC๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด์ ์ผ๋ก ๋น๋๋ฅผ ์๋ํ ์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ด ์๋ํ๋์ง/์ง์๋์ด์ผ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
-์จ
์ต์ํ CC_FOR_CGO=gcc๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
https://go-review.googlesource.com/c/go/+/133940 ์ ๋ช ๊ฐ์ง ํ ์คํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํ ์คํธ ํต๊ณผ๋ฅผ ์ด๋ป๊ฒ ํ์ธํฉ๋๊น? ์ ํํ ๋จ๊ณ๋ ๋ฌด์์ ๋๊น?
๋ํ Go ๋น๋ https://build.golang.org %GOROOT%\src\all.bat๋ฅผ ์คํํ์ฌ ๋ชจ๋ ํ ์คํธ(https://go-review.googlesource.com/c/go/+/์ ๋์ด๋ ํ ์คํธ ํฌํจ)๋ฅผ ํ์ธํฉ๋๋ค. 133940) ํต๊ณผ. %GOROOT%\src\all.bat๊ฐ https://go-review.googlesource.com/c/go/+/133940 ์์ ์กฐ์ ๋ ํ ์คํธ๋ฅผ ์คํํ๋๋ก Go ์ฝ๋๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค
๋ํ ๊ฐ์ธ์ ์ผ๋ก MSVC๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด์ ์ผ๋ก ๋น๋๋ฅผ ์๋ํ ์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ด ์๋ํ๋์ง/์ง์๋์ด์ผ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
gcc๋ฅผ ์ค์นํ์ง ์๊ณ ๋ all.bat๋ฅผ ์คํํ์ฌ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ ์ ์์ต๋๋ค. ํ์ฌ Go ๋ฒ์ ์ ๋น๋ํ๋ ค๋ฉด ๋ค๋ฅธ Go ๋ฒ์ (์ ์ด๋ go1.4)๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. Cgo์๋ง C ์ปดํ์ผ๋ฌ๊ฐ ํ์ํฉ๋๋ค. ๊ทํ์ ๋ณ๊ฒฝ ์ฌํญ์ด MSVC๋ก ๋น๋๋ Cgo ๋ฒ์ ์ ๊ตฌํํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ๋ด๊ฐ ์ฐฉ๊ฐํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ๋ฅผ ์์ ํ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
@alexbrainman
https://go-review.googlesource.com/c/go/+/133940 ์ ๋ช ๊ฐ์ง ํ ์คํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํ ์คํธ ํต๊ณผ๋ฅผ ์ด๋ป๊ฒ ํ์ธํฉ๋๊น? ์ ํํ ๋จ๊ณ๋ ๋ฌด์์ ๋๊น?
์๋ง๋ all.bat๋ ํ ์คํธ์ gcc ๋ฐ msvc ๋ฒ์ ์ ๋ชจ๋ ํ ์คํธํ ์ ์์ต๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ์คํํ ํ ์คํธ ๋ฒ์ ์ all.bat์ ์๋ ค์ฃผ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๊ฐ์ ๋ค๋ฅธ ๋น๋๊ฐ ๋ค๋ฅธ ๋ฒ์ ์ ํ ์คํธ๋ฅผ ์คํํ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฑธ ๋ค ์๊ฐํ์ด?
์, ์ด ์ ํํ ๋ฉ์ปค๋์ฆ์ https://go-review.googlesource.com/c/go/+/133946/ ์์ ์ฌ์ฉ๋ฉ๋๋ค
gcc๋ฅผ ์ค์นํ์ง ์๊ณ ๋ all.bat๋ฅผ ์คํํ์ฌ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ ์ ์์ต๋๋ค. ํ์ฌ Go ๋ฒ์ ์ ๋น๋ํ๋ ค๋ฉด ๋ค๋ฅธ Go ๋ฒ์ (์ ์ด๋ go1.4)๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. Cgo์๋ง C ์ปดํ์ผ๋ฌ๊ฐ ํ์ํฉ๋๋ค. ๊ทํ์ ๋ณ๊ฒฝ ์ฌํญ์ด MSVC๋ก ๋น๋๋ Cgo ๋ฒ์ ์ ๊ตฌํํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ๋ด๊ฐ ์ฐฉ๊ฐํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ๋ฅผ ์์ ํ์ญ์์ค.
๋น์ ์ด ์ฌ๋ฐ๋ฅธ์ง. Go ์์ฒด๋ ์ ๋น๋๋์ด์ผ ํฉ๋๋ค. GOTESTMSVC=1์ผ ๋ ์ผ๋ถ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋๋ก run.bat๊ฐ ์์ ๋์๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ ๋๋ฌํ ๋ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. go๊ฐ msvc๋ก ๋น๋๋๊ณ ์๋์ง ๊ฐ์งํ๊ณ ์ ์ ํ dist ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ฌ ํ ์คํธ๊ฐ ์คํจํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ GOTESTMSVC=1 ๋ฐ GOVSVARSPATH=some vsvars.bat ๊ฒฝ๋ก๋ฅผ ์ค์ ํฉ๋๋ค. all.bat๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ ํ gcc ๋ฐ msvc cgo ํ ์คํธ๋ฅผ ๋ชจ๋ ์คํํด์ผ ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๋ํ๋ค.
๋๋ ์ฌ์ฉํ๋ค
commit e56d52f66b95b87001867a2487a11bd961f40d4d (HEAD)
Author: Caleb Champlin <[email protected]>
Date: Sat Sep 8 00:26:32 2018 -0600
cmd/compile: add support for MSVC toolchain to go build
Allows building with MSVC as an external compiler/linker.
Setting CC=cl.exe inside an MSVC environment will automatically
build cgo executables using MSVC as the external compiler and
linker.
For the builders setting the environment variable GOVSVARSPATH
to the location of a msvsvars.bat file and setting the
environment variable GOTESTMSVC=1 will automatically cause
all.bat to run tests and compiler with both gcc and MSVC.
Updates #20982
Change-Id: I44be1f43aa0d53a688c595bc8336e0364b809ced
์ด ๋ฐฐ์น ํ์ผ์ ๋จผ์ ์คํํฉ๋๋ค.
set TERM=msys
set MYHOME=c:\users\alex\dev
set GOROOT=%MYHOME%\go
set GOROOT_BOOTSTRAP=%MYHOME%\go1.4.3
set GOPATH=%MYHOME%
set MINGW=%MYHOME%\mingw64_4.9.1
set GOTESTMSVC=1
set GOVSVARSPATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
set PATH=%PATH%;%MINGW%\bin;%MYHOME%\my\bin\;%GOROOT%\bin
cd %GOROOT%\src
CMD
๊ทธ๋ฐ ๋ค์ all.bat
๋ฅผ ์คํํฉ๋๋ค. all.bat
์คํจ
--- FAIL: TestDocsUpToDate (0.00s)
help_test.go:26: alldocs.go is not up to date; run mkalldocs.sh to regenerate it
go test proxy starting
go test proxy running at GOPROXY=http://127.0.0.1:52023/mod
go proxy: no archive w.1 v1.2.0
go proxy: no archive x.1 v1.0.0
go proxy: no archive z.1 v1.2.0
go proxy: no archive rsc.io v1.5.0
go proxy: no archive example.com/unused v0.0.0
go proxy: no archive example.com/unused v0.0.0
go proxy: no archive sub.1 v1.0.0
go proxy: no archive badsub.1 v1.0.0
go proxy: no archive versioned.1 v1.0.0
go proxy: no archive versioned.1 v1.1.0
go proxy: no archive golang.org/x/text/language 14c0d48
go proxy: no archive golang.org/x/text/language 14c0d48
go proxy: no archive golang.org/x/text/language 14c0d48
go proxy: no archive golang.org/x/text/foo 14c0d48
go proxy: no archive golang.org/x 14c0d48
go proxy: no archive golang.org 14c0d48
go proxy: no archive example.com/split/subpkg v1.0.0
FAIL
FAIL cmd/go 147.247s
ok cmd/go/internal/cache 13.115s
ok cmd/go/internal/dirhash 0.518s
ok cmd/go/internal/generate 0.180s
ok cmd/go/internal/get 0.761s
ok cmd/go/internal/imports 0.212s
ok cmd/go/internal/load 1.050s
ok cmd/go/internal/modconv 1.596s
ok cmd/go/internal/modfetch 0.881s
ok cmd/go/internal/modfetch/codehost 0.179s
ok cmd/go/internal/modfile 0.193s
ok cmd/go/internal/modload 2.820s
ok cmd/go/internal/module 0.860s
ok cmd/go/internal/mvs 0.255s
ok cmd/go/internal/par 0.107s
ok cmd/go/internal/search 0.087s
ok cmd/go/internal/semver 0.140s
ok cmd/go/internal/txtar 0.249s
ok cmd/go/internal/web2 0.136s
ok cmd/go/internal/work 0.200s
ok cmd/gofmt 0.216s
ok cmd/internal/buildid 0.522s
ok cmd/internal/dwarf 0.077s
ok cmd/internal/edit 0.160s
ok cmd/internal/goobj 2.430s
ok cmd/internal/obj 0.103s
ok cmd/internal/obj/arm64 0.190s
ok cmd/internal/obj/x86 0.845s
ok cmd/internal/objabi 0.063s
ok cmd/internal/src 0.093s
ok cmd/internal/test2json 0.253s
ok cmd/link 6.285s
ok cmd/link/internal/ld 24.147s
ok cmd/link/internal/sym 0.887s
ok cmd/nm 7.678s
ok cmd/objdump 2.772s
ok cmd/pack 3.256s
ok cmd/trace 0.449s
ok cmd/vendor/github.com/google/pprof/internal/binutils 0.479s
ok cmd/vendor/github.com/google/pprof/internal/driver 6.103s
ok cmd/vendor/github.com/google/pprof/internal/elfexec 0.079s
ok cmd/vendor/github.com/google/pprof/internal/graph 0.455s
ok cmd/vendor/github.com/google/pprof/internal/measurement 0.066s
ok cmd/vendor/github.com/google/pprof/internal/report 0.154s
ok cmd/vendor/github.com/google/pprof/internal/symbolizer 0.096s
ok cmd/vendor/github.com/google/pprof/internal/symbolz 0.078s
ok cmd/vendor/github.com/google/pprof/profile 0.527s
ok cmd/vendor/github.com/ianlancetaylor/demangle 0.109s
ok cmd/vendor/golang.org/x/arch/arm/armasm 0.424s
ok cmd/vendor/golang.org/x/arch/arm64/arm64asm 0.537s
ok cmd/vendor/golang.org/x/arch/ppc64/ppc64asm 0.155s
ok cmd/vendor/golang.org/x/arch/x86/x86asm 0.239s
ok cmd/vendor/golang.org/x/crypto/ssh/terminal 0.174s
ok cmd/vendor/golang.org/x/sys/windows 0.334s
ok cmd/vendor/golang.org/x/sys/windows/registry 0.199s
ok cmd/vendor/golang.org/x/sys/windows/svc 0.316s
ok cmd/vendor/golang.org/x/sys/windows/svc/eventlog 0.089s
ok cmd/vendor/golang.org/x/sys/windows/svc/mgr 0.432s
ok cmd/vet 6.392s
ok cmd/vet/internal/cfg 0.102s
2018/12/16 15:55:18 Failed: exit status 1
๋ํ GOTESTMSVC ๋ฐ GOVSVARSPATH๋ฅผ ์ค์ ํ๋ฉด all.bat๋ฅผ ์คํํ๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ Cgo์ฉ MSVC๋ฅผ ์ฌ์ฉํด์ผ ํ ๋ ๋ฌด์์ ํฉ๋๊น? ๊ทธ๊ฒ์ ๋ํ ๋น์ ์ ๊ณํ์ ๋ฌด์์ ๋๊น?
์๋ ์ค
@alexbrainman
๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ ํ
์คํธ๋ ๋ง์คํฐ์์ ๋์๊ฒ ์คํจํ๊ณ ์์ต๋๋ค.
> git status
On branch master
Your branch is up to date with 'origin/master'
> cd src\cmd\go
> go test .\help_test.go
--- FAIL: TestDocsUpToDate (0.00s)
help_test.go:26: alldocs.go is not up to date; run mkalldocs.sh to regenerate it
help.go์์ https://github.com/golang/go/blob/c040786f37246f40ae29402fbdb6e97031a21713/src/cmd/go/internal/help/help.go#L37
base.Go.Commands๋ฅผ ํตํด ๋ฐ๋ณตํฉ๋๋ค. main.go์์ ์ด๊ธฐํ๋๋ https://github.com/golang/go/blob/c040786f37246f40ae29402fbdb6e97031a21713/src/cmd/go/main.go#L43
ํ์ง๋ง ๊ทธ init ํจ์๊ฐ ํ
์คํธ ์คํ ํ์ผ์์ ์ด๋ป๊ฒ ํธ์ถ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋์ ์ง๊ธ ๋ง์คํฐ๊ฐ ํ
์คํธ๋ฅผ ์ด๋ป๊ฒ ํต๊ณผํ๊ณ ์๋์ง ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๋ฐ์ ์ผ๋ก ์คํจํด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ํ GOTESTMSVC ๋ฐ GOVSVARSPATH๋ฅผ ์ค์ ํ๋ฉด all.bat๋ฅผ ์คํํ๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ Cgo์ฉ MSVC๋ฅผ ์ฌ์ฉํด์ผ ํ ๋ ๋ฌด์์ ํฉ๋๊น? ๊ทธ๊ฒ์ ๋ํ ๋น์ ์ ๊ณํ์ ๋ฌด์์ ๋๊น?
๋ฐ๋ผ์ MSVC๋ก ์ผ๋ถ Cgo ์ฝ๋๋ฅผ ๋น๋ํ๋ ค๋ ์ํฉ์์
call vsvars64.bat
set CC_FOR_CGO=gcc
set CC=cl.exe
go build
๋ด๊ฐ ์๊ฐํ๊ธฐ์ ๋น์ ์ด ํ์๋กํ๋ ๋ชจ๋ ๊ฒ์ด์ด์ผํฉ๋๋ค
๊ทธ init ํจ์๊ฐ ํ ์คํธ ์คํ ํ์ผ์์ ์ด๋ป๊ฒ ํธ์ถ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋์ ์ง๊ธ ๋ง์คํฐ๊ฐ ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๋ฐ์ ์ผ๋ก ์คํจํด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
cmd/go์ ํ์ผ๊ณผ ํจ๊ป go test
๋ฅผ ์ฌ์ฉํ ๋ go ๋๊ตฌ๋ cmd/go ํจํค์ง๋ฅผ ๋น๋ํ ๋ค์ ํ
์คํธ๋ฅผ ๋น๋ํ๊ณ ํ
์คํธ ๋๋ผ์ด๋ฒ๋ฅผ ์์ฑํ๊ณ ๋น๋ํ๊ณ ๋ชจ๋ ๊ฒ์ ํจ๊ป ์ ๊ธฐ๋ณธ ํจํค์ง์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ cmd/go ์์ฒด๊ฐ ๊ธฐ๋ณธ ํจํค์ง์ธ ๊ฒฝ์ฐ์๋ ๋ฐ์ํฉ๋๋ค. ์ฆ, cmd/go/*.go์ ๊ธฐ๋ณธ ํจํค์ง๋ ํ
์คํธ๋ฅผ ์ํด ๊ธฐ๋ณธ์ด ์๋ ํจํค์ง๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ
์คํธ๋ ์ ์ ํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ํจํค์ง์ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค, ๋ต๋ณ์ด ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ ๋ค์ ์กฐ์ฌํ ์ฌ์ ๊ฐ ์์๋ค.
๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ ํ ์คํธ๋ ๋ง์คํฐ์์ ๋์๊ฒ ์คํจํ๊ณ ์์ต๋๋ค.
์ ๋ ๋ง์คํฐ๋ฅผ ์ฌ์ฉํ์ง ์์์ต๋๋ค. ๊ทํ์ e56d52f66b95b87001867a2487a11bd961f40d4d ์ปค๋ฐ์ ์ฌ์ฉํ์ต๋๋ค. ๊ฒํ ๋ฅผ ์ํด ๋ณด๋ด๊ธฐ ์ ์ ํด๋น ์ปค๋ฐ์ ๋ํด all.bat๋ฅผ ์คํํ์ง ์์์ต๋๊น? all.bat๊ฐ ์ฑ๊ณตํ์ต๋๊น? ๋ด ์์คํ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ํด๋น ์ปค๋ฐ์์ all.bat๋ฅผ ๋ค์ ์คํํด ๋ณผ ์ ์์ต๋๊น? ๊ฐ์ฌํฉ๋๋ค.
๋ฐ๋ผ์ MSVC๋ก ์ผ๋ถ Cgo ์ฝ๋๋ฅผ ๋น๋ํ๋ ค๋ ์ํฉ์์
call vsvars64.bat set CC_FOR_CGO=gcc set CC=cl.exe go build
๋ด๊ฐ ์๊ฐํ๊ธฐ์ ๋น์ ์ด ํ์๋กํ๋ ๋ชจ๋ ๊ฒ์ด์ด์ผํฉ๋๋ค
2 ํ๊ฒฝ ๋ณ์๋ ์๋ง๋ ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ ๋๋ฌด ๋ณต์กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ CC_FOR_CGO=gcc
๊ฐ ์ด์ํด ๋ณด์
๋๋ค. MSVC๋ก ์ฝ๋๋ฅผ ๋น๋ํ๊ธฐ ์ํด gcc๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์๋ ์ค
@alexbrainman
์ ๋ ๋ง์คํฐ๋ฅผ ์ฌ์ฉํ์ง ์์์ต๋๋ค. ๊ทํ์ e56d52f66b95b87001867a2487a11bd961f40d4d ์ปค๋ฐ์ ์ฌ์ฉํ์ต๋๋ค. ๊ฒํ ๋ฅผ ์ํด ๋ณด๋ด๊ธฐ ์ ์ ํด๋น ์ปค๋ฐ์ ๋ํด all.bat๋ฅผ ์คํํ์ง ์์์ต๋๊น? all.bat๊ฐ ์ฑ๊ณตํ์ต๋๊น? ๋ด ์์คํ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ํด๋น ์ปค๋ฐ์์ all.bat๋ฅผ ๋ค์ ์คํํด ๋ณผ ์ ์์ต๋๊น? ๊ฐ์ฌํฉ๋๋ค.
ํ ์คํธ๋ฅผ ์คํํ ๋ ์ด์ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ ์์คํ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ณ๊ฒฝ ์ธํธ์ ๋ํ ์ผ๋ถ ์ ๋ฐ์ดํธ๋ฅผ ํธ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
2 ํ๊ฒฝ ๋ณ์๋ ์๋ง๋ ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ ๋๋ฌด ๋ณต์กํฉ๋๋ค. CC_FOR_CGO=gcc๊ฐ ์ด์ํด ๋ณด์ ๋๋ค. MSVC๋ก ์ฝ๋๋ฅผ ๋น๋ํ๊ธฐ ์ํด gcc๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ค์ ๋ก CC_FOR_CGO=gcc.exe์ฌ์ผ ํฉ๋๋ค. ์ ์ค์์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทํ์ ์ง๋ฌธ์ ๋๋ตํ๊ธฐ ์ํด; ๊ฒ๋ฆฟ์์:
PS1, 1324ํ:
cgo๋ ์ฌ์ ํ ์ ํ ๋ถ์์ ์ฌ์ฉํ ์ ์๋ gcc๊ฐ ํ์ํฉ๋๋ค. CC๊ฐ MSVC ์ปดํ์ผ๋ฌ๋ก ์ค์ ๋ ๊ฒฝ์ฐ cgo๋ CC_FOR_CGO์์ ์ ๊ณตํ๋ GCC๋ฅผ ํธ์ถํ๋ ์๋จ์ด ํ์ํฉ๋๋ค. ๋ถํํ๋ MSVC ๋๊ตฌ ์ฒด์ธ์๋ gcc์์ ์์ง๋๋ ๋์ผํ ์ ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก go ํน์ ๋๊ตฌ๋ cgo์์ ์ฌ์ฉํ๋ ์ ํ ์ ๋ณด๋ฅผ ์์งํ๊ธฐ ์ํด ๋ง๋ค ์ ์์ง๋ง ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์๋นํ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ ์ ์์ต๋๋ค(์ ๋ ๊ฐ์ธ์ ์ผ๋ก C/C++ ์ฝ๋์ ์ ์ ์ ํ ๋ถ์์ ์ํํ๊ธฐ ์ํด ์๋ฌด ๊ฒ๋ ์์ฑํ์ง ์์์ต๋๋ค).
๋ํ GCC ๋ MSVC ์คํ ์ฌ์ด์ ์บ์ ์ง์ฐ๊ธฐ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๊นจ๋จ๋ฆฐ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋ถ ํ ์คํธ๊ฐ ์ฌ์ ํ ์บ์๋ ๊ฒ์ฒ๋ผ ์๋ํ๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ณ๊ฒฝ ์ธํธ์ ๋ํ ์ผ๋ถ ์ ๋ฐ์ดํธ๋ฅผ ํธ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ค์ ์ https://github.com/golang/go/issues/20982#issuecomment -447618566์์
commit 5479fc9fe61fb998082fea5cb423314cc1afa649 (HEAD)
Author: Caleb Champlin <[email protected]>
Date: Sat Sep 8 00:26:32 2018 -0600
cmd/compile: add support for MSVC toolchain to go build
Allows building with MSVC as an external compiler/linker.
Setting CC=cl.exe inside an MSVC environment will automatically
build cgo executables using MSVC as the external compiler and
linker.
For the builders setting the environment variable GOVSVARSPATH
to the location of a msvsvars.bat file and setting the
environment variable GOTESTMSVC=1 will automatically cause
all.bat to run tests and compiler with both gcc and MSVC.
Updates #20982
Change-Id: I44be1f43aa0d53a688c595bc8336e0364b809ced
๋๋ฅผ ๋ ๋ฉ๋ฆฌ ๋ฐ๋ ค๋ค ์ฃผ์ง๋ง ์ฌ์ ํ ์คํจํฉ๋๋ค.
##### API check
+pkg go/build, type Context struct, CompilerType string
+pkg go/build, type Package struct, CgoMSCFLAGS []string
+pkg go/build, type Package struct, CgoMSCPPFLAGS []string
+pkg go/build, type Package struct, CgoMSCXXFLAGS []string
+pkg go/build, type Package struct, CgoMSLDFLAGS []string
+pkg os, method (*File) SyscallConn() (syscall.RawConn, error)
ALL TESTS PASSED
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0.26730.12
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
# runtime/cgo
msvc_libinit_windows.c
msvc_libinit_windows.c(133): error C2220: warning treated as error - no 'object' file generated
msvc_libinit_windows.c(133): warning C4710: 'int fprintf(FILE *const ,const char *const ,...)': function not inlined
C:\Program Files (x86)\Windows Kits\10\include\10.0.15063.0\ucrt\stdio.h(826): note: see declaration of 'fprintf'
go tool dist: FAILED: go install -gcflags=all= -ldflags=all= std cmd: exit status 2
c:\Users\Alex\dev\go\src>
์ค์ ๋ก CC_FOR_CGO=gcc.exe์ฌ์ผ ํฉ๋๋ค. ์ ์ค์์ ๋๋ค.
๋๋ gcc.exe์ .exe์ ๋ํด ๊ฑฑ์ ํ์ง ์์ต๋๋ค. ๋ด ๋ฌธ์ ๋
MSVC๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด gcc์ MSVC ๋๊ตฌ๊ฐ ๋ชจ๋ ํ์ํ์ง๋ง(์ฌ์ฉ์์๊ฒ ์ค๋ช ํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์) ์ด์ ๋ํด ์๋ฌด ๊ฒ๋ ํ ์ ์์์ ์ดํดํฉ๋๋ค.
CC_FOR_CGO=gcc ๋ฐ CC=cl.exe ์ค์ ํ๊ฒฝ ๋ณ์๊ฐ ๋ชจ๋ ํ์ํ์ต๋๋ค. CC_FOR_CGO๊ฐ ํญ์ gcc๋ก ์ค์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๊น?
๊ทธ๋ฌ๋ ๊ทํ์ ์ง๋ฌธ์ ๋๋ตํ๊ธฐ ์ํด; ๊ฒ๋ฆฟ์์:
์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
@alexbrainman
# runtime/cgo
msvc_libinit_windows.c
msvc_libinit_windows.c(133): error C2220: warning treated as error - no 'object' file generated
msvc_libinit_windows.c(133): warning C4710: 'int fprintf(FILE *const ,const char *const ,...)': function not inlined
C:\Program Files (x86)\Windows Kits\10\include\10.0.15063.0\ucrt\stdio.h(826): note: see declaration of 'fprintf'
go tool dist: FAILED: go install -gcflags=all= -ldflags=all= std cmd: exit status 2
msvc_libinit_windows.c์ ๋ค๋ฅธ/์ด์ ์ฌ๋ณธ์ด ์๋ ํ ๊ฒฝ๊ณ ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค์ ์ค์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ ์ ์์ต๋๊น?
// src/runtime/cgo/msvc_libinit_windows.c
#pragma warning(disable:4668 4255 4710)
C4710์ stdio ํฌํจ์ ๋ํด ์ต์ ๋์ด์ผ ํฉ๋๋ค. ๊ทํ์ MSVC ๋ฒ์ ์ด ๋ด ๋ฒ์ ๊ณผ ์ฝ๊ฐ ๋ค๋ฅด๋ฉฐ ์ด๊ฒ์ด ๋ฒ์ธ์ผ ์๋ ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ๋ค๋ฅธ ๋ฒ์ ์์ ๊ทธ ์ต์ ๋ฅผ ์ ๊ทน์ ์ผ๋ก ๋ฌด์ํ๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ ๋ฌด์์ด๋ ์๊ด์์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ต์ ๋ฅผ ํฌํจํ๋๋ก ๋ณ๊ฒฝ์ ์๋ํ ์ ์์ต๋๋ค.
// src/cmd/go/internal/work/exec.go
// Line 2719
cgoMSCPPFLAGS = append(cgoMSCFLAGS, "/wd4668") // this should be cgoMSCFLAGS = append(cgoMSCFLAGS, "/wd4668") I'll fix the change set to correct
+cgoMSCFLAGS = append(cgoMSCFLAGS, "/wd4710")
CC_FOR_CGO=gcc ๋ฐ CC=cl.exe ์ค์ ํ๊ฒฝ ๋ณ์๊ฐ ๋ชจ๋ ํ์ํ์ต๋๋ค. CC_FOR_CGO๊ฐ ํญ์ gcc๋ก ์ค์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๊น?
CC_FOR_CGO๊ฐ ์ค์ ๋์ด ์์ง ์์ผ๋ฉด gcc๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ gco๊ฐ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. CC_FOR_CGO๋ ๊ฒฝ๋ก์ gcc๊ฐ ์๋ ๋์ ๊ฐ์ ์ฌ๋๋ค์ ์ํ ๊ฒ์ ๋๋ค. ๋ด CC_FOR_CGO๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. CC_FOR_CGO=I:\Development\tmd-gcc\bingcc.exe. MSVC ๋น๋ ๊ฒฝ๋ก์ ์๋ GCC์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ์ง ์์ผ๋ ค๋ฉด ์๋ ค์ฃผ์๋ฉด ํ๊ฒฝ ๋ณ์๋ฅผ ํจ๊ป ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ด ๋ฒ์ ์ผ๋ก ๋ค์ ์๋ํ์ต๋๋ค
commit 6741b7009d1894b5bf535d82ad46f4a379651670 (HEAD)
Author: Caleb Champlin <[email protected]>
Date: Sat Sep 8 00:26:32 2018 -0600
cmd/compile: add support for MSVC toolchain to go build
Allows building with MSVC as an external compiler/linker.
Setting CC=cl.exe inside an MSVC environment will automatically
build cgo executables using MSVC as the external compiler and
linker.
For the builders setting the environment variable GOVSVARSPATH
to the location of a msvsvars.bat file and setting the
environment variable GOTESTMSVC=1 will automatically cause
all.bat to run tests and compiler with both gcc and MSVC.
Updates #20982
Change-Id: I44be1f43aa0d53a688c595bc8336e0364b809ced
๊ทธ๋ฆฌ๊ณ ๋๋ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค
##### API check
+pkg go/build, type Context struct, CompilerType string
+pkg go/build, type Package struct, CgoMSCFLAGS []string
+pkg go/build, type Package struct, CgoMSCPPFLAGS []string
+pkg go/build, type Package struct, CgoMSCXXFLAGS []string
+pkg go/build, type Package struct, CgoMSLDFLAGS []string
+pkg os, method (*File) SyscallConn() (syscall.RawConn, error)
ALL TESTS PASSED
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0.26730.12
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
# runtime/cgo
msvc_libinit_windows.c
msvc_libinit_windows.c(133): error C2220: warning treated as error - no 'object' file generated
msvc_libinit_windows.c(133): warning C4710: 'int fprintf(FILE *const ,const char *const ,...)': function not inlined
C:\Program Files (x86)\Windows Kits\10\include\10.0.15063.0\ucrt\stdio.h(826): note: see declaration of 'fprintf'
go tool dist: FAILED: go install -gcflags=all= -ldflags=all= std cmd: exit status 2
c:\Users\Alex\dev\go\src>
๋ค์ ์ค์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ ์ ์์ต๋๊น?
// src/runtime/cgo/msvc_libinit_windows.c #pragma warning(disable:4668 4255 4710)
์ด๊ฒ์ ๋ด src/runtime/cgo/msvc_libinit_windows.c ํ์ผ์ ์์์ ๋๋ค.
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build cgo
#define WIN64_LEAN_AND_MEAN
// Suppress MSVC specific warnings.
// C4668: symbol' is not defined as a preprocessor macro,
// replacing with '0' for 'directives'.
// C4255: function' : no function prototype given: converting '()'
// to '(void)'.
// C4710: function' : function not inlined
#pragma warning(disable:4668 4255 4710)
#include <windows.h>
#include <process.h>
...
๋ํ ๋ฌด์์ด๋ ์๊ด์์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ต์ ๋ฅผ ํฌํจํ๋๋ก ๋ณ๊ฒฝ์ ์๋ํ ์ ์์ต๋๋ค.
// src/cmd/go/internal/work/exec.go // Line 2719 cgoMSCPPFLAGS = append(cgoMSCFLAGS, "/wd4668") // this should be cgoMSCFLAGS = append(cgoMSCFLAGS, "/wd4668") I'll fix the change set to correct +cgoMSCFLAGS = append(cgoMSCFLAGS, "/wd4710")
๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ต๋๋ค.
c:\Users\Alex\dev\go\src>git diff
diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
index 49d1d849f5..9fb442ab95 100644
--- a/src/cmd/go/internal/work/exec.go
+++ b/src/cmd/go/internal/work/exec.go
@@ -2717,6 +2717,7 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcMSCFLAGS, pc
cgoLDFLAGS = append(cgoLDFLAGS, pcLDFLAGS...)
if cfg.BuildContext.CompilerType == "msvc" {
cgoMSCFLAGS = append(cgoMSCFLAGS, "/wd4668")
+ cgoMSCFLAGS = append(cgoMSCFLAGS, "/wd4710")
cgoMSCPPFLAGS = append(cgoMSCPPFLAGS, pcMSCFLAGS...)
cgoMSCPPFLAGS = append(cgoMSCPPFLAGS, "/c")
c:\Users\Alex\dev\go\src>
ํ์ง๋ง ๊ฐ์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค
##### API check
+pkg go/build, type Context struct, CompilerType string
+pkg go/build, type Package struct, CgoMSCFLAGS []string
+pkg go/build, type Package struct, CgoMSCPPFLAGS []string
+pkg go/build, type Package struct, CgoMSCXXFLAGS []string
+pkg go/build, type Package struct, CgoMSLDFLAGS []string
+pkg os, method (*File) SyscallConn() (syscall.RawConn, error)
ALL TESTS PASSED
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0.26730.12
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
# runtime/cgo
msvc_libinit_windows.c
msvc_libinit_windows.c(133): error C2220: warning treated as error - no 'object' file generated
msvc_libinit_windows.c(133): warning C4710: 'int fprintf(FILE *const ,const char *const ,...)': function not inlined
C:\Program Files (x86)\Windows Kits\10\include\10.0.15063.0\ucrt\stdio.h(826): note: see declaration of 'fprintf'
go tool dist: FAILED: go install -gcflags=all= -ldflags=all= std cmd: exit status 2
c:\Users\Alex\dev\go\src>
์๋ ์ค
์ด์ ฏ๋ฐค์ ์ด๊ฒ์ ์ฌํํ๋ ค๊ณ ํ๋๋ฐ ํ ์ ์์์ต๋๋ค. ๋๋ ๋น์ ์ด ์ด๊ฒ์ ๊ฒฝํํ๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค : https://developercommunity.visualstudio.com/content/problem/35734/c-cannot-disable-specific-warnings-with-pragmas-wh.html
์ต์ SDK ๋ฐ ๋น๋ ๋๊ตฌ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น? ์ ๋ SDK 10.0.17763.0์ ์ฌ์ฉ ์ค์ ๋๋ค. ๋ฐ ๋น๋ ๋๊ตฌ/devenv์ ๋ฒ์ 15.9.28307.222
MSVC๋ฅผ ์ฌ์ฉํ์ฌ Windows DLL์ ๋น๋ํ๋ ค๊ณ ํ๋๋ฐ Go๊ฐ 65535(๋๋ ์ซ์๊ฐ ์๋)๋ณด๋ค ํฐ ์ซ์๋ก ์ผ๋ถ ๊ฒฝ๊ณ ๋ฅผ ๋นํ์ฑํํ๋ ค๊ณ ์๋ํ์ฌ MSVC๊ฐ ์ค์ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋์. Werror
๋ ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ GCC ์ต์
์
๋๋ค.
MSVC์ ๊ฒฝ์ฐ WX
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@pravic ์ข์ ์ , ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น์? ๋๋ ๊ทธ๊ฒ์ ์ค์ ํ์ง ์๊ณ ๋ด๊ฐํ๊ณ ์๋ ๋ชจ๋ ๊ฒ :
set CC=cl.exe
go build -o next.dll .\main.go
@galich ๋ถํํ๋ MSVC ํตํฉ์ ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ๋์ธ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ด ์ค๋ ๋์ ๊ด๋ จ๋ ํจ์น๋ ์ด๋์ ์์ต๋๊น? ๋ง์คํฐ์์ ๋๋ ๋ค๋ฅธ ๊ณณ์์?
@pravic ์์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์์ต๋๋ค. https://go-review.googlesource.com/c/go/+/133946/5
@mxplusb ๋งํฌ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. /
์ด๊ฒ์ด ์ธ์ ๋ฒ ํ/์ผ๊ฐ/์์ ์ ์ผ๋ก ์ ๊ณต๋๋์ง ์์ญ๋๊น?
์ต์ SDK ๋ฐ ๋น๋ ๋๊ตฌ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น? ์ ๋ SDK 10.0.17763.0์ ์ฌ์ฉ ์ค์ ๋๋ค. ๋ฐ ๋น๋ ๋๊ตฌ/devenv์ ๋ฒ์ 15.9.28307.222
@cchamplin ๋ง์นจ๋ด MSVC๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์์ต๋๋ค. ๋๋ ์ง๊ธ ๊ฐ์ง๊ณ ์์ด
c:\Users\Alex\dev\go\src>%GOVSVARSPATH%
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
c:\Users\Alex\dev\go\src>cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27030.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
c:\Users\Alex\dev\go\src>
์ด ๋ฒ์ ์ผ๋ก ๋ค์ ์๋ํ์ต๋๋ค
commit 6741b7009d1894b5bf535d82ad46f4a379651670 (HEAD)
Author: Caleb Champlin <[email protected]>
Date: Sat Sep 8 00:26:32 2018 -0600
cmd/compile: add support for MSVC toolchain to go build
Allows building with MSVC as an external compiler/linker.
Setting CC=cl.exe inside an MSVC environment will automatically
build cgo executables using MSVC as the external compiler and
linker.
For the builders setting the environment variable GOVSVARSPATH
to the location of a msvsvars.bat file and setting the
environment variable GOTESTMSVC=1 will automatically cause
all.bat to run tests and compiler with both gcc and MSVC.
Updates #20982
Change-Id: I44be1f43aa0d53a688c595bc8336e0364b809ced
all.bat๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๋ฌํ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์ต๋๋ค.
##### ../misc/cgo/stdio
##### ../misc/cgo/life
##### ../misc/cgo/test
# _/c_/Users/Alex/dev/go/misc/cgo/test
issue28896.cgo2.c
.\issue28896.go(30): warning C4820: '<anonymous-tag>': '4' bytes padding added after data member 'g1'
.\issue28896.go(36): warning C4820: '<anonymous-tag>': '4' bytes padding added after data member 'f2'
# _/c_/Users/Alex/dev/go/misc/cgo/test
cthread_windows.c
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(39) : warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(37) : note: index 'i' range checked by comparison on this line
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(39) : note: feeds call on this line
PASS
scatter = 00007FF670706000
hello from C
sqrt is: 0
ok _/c_/Users/Alex/dev/go/misc/cgo/test 3.534s
# _/c_/Users/Alex/dev/go/misc/cgo/test
issue28896.cgo2.c
.\issue28896.go(30): warning C4820: '<anonymous-tag>': '4' bytes padding added after data member 'g1'
.\issue28896.go(36): warning C4820: '<anonymous-tag>': '4' bytes padding added after data member 'f2'
# _/c_/Users/Alex/dev/go/misc/cgo/test
cthread_windows.c
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(39) : warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(37) : note: index 'i' range checked by comparison on this line
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(39) : note: feeds call on this line
PASS
scatter = 00007FF7DD026000
hello from C
sqrt is: 0
ok _/c_/Users/Alex/dev/go/misc/cgo/test 3.229s
# _/c_/Users/Alex/dev/go/misc/cgo/test
issue28896.cgo2.c
.\issue28896.go(30): warning C4820: '<anonymous-tag>': '4' bytes padding added after data member 'g1'
.\issue28896.go(36): warning C4820: '<anonymous-tag>': '4' bytes padding added after data member 'f2'
# _/c_/Users/Alex/dev/go/misc/cgo/test
cthread_windows.c
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(39) : warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(37) : note: index 'i' range checked by comparison on this line
c:\users\alex\dev\go\misc\cgo\test\cthread_windows.c(39) : note: feeds call on this line
PASS
scatter = 00007FF655CF6000
hello from C
sqrt is: 0
ok _/c_/Users/Alex/dev/go/misc/cgo/test 3.172s
##### ../test/bench/go1
testing: warning: no tests to run
PASS
ok _/c_/Users/Alex/dev/go/test/bench/go1 3.178s
##### ../test
##### API check
+pkg go/build, type Context struct, CompilerType string
+pkg go/build, type Package struct, CgoMSCFLAGS []string
+pkg go/build, type Package struct, CgoMSCPPFLAGS []string
+pkg go/build, type Package struct, CgoMSCXXFLAGS []string
+pkg go/build, type Package struct, CgoMSLDFLAGS []string
+pkg os, method (*File) SyscallConn() (syscall.RawConn, error)
ALL TESTS PASSED
---
Installed Go for windows/amd64 in c:\Users\Alex\dev\go
Installed commands in c:\Users\Alex\dev\go\bin
*** You need to add c:\Users\Alex\dev\go\bin to your PATH.
c:\Users\Alex\dev\go\src>
๋ํ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์คํํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
...
##### API check
+pkg go/build, type Context struct, CompilerType string
+pkg go/build, type Package struct, CgoMSCFLAGS []string
+pkg go/build, type Package struct, CgoMSCPPFLAGS []string
+pkg go/build, type Package struct, CgoMSCXXFLAGS []string
+pkg go/build, type Package struct, CgoMSLDFLAGS []string
+pkg os, method (*File) SyscallConn() (syscall.RawConn, error)
ALL TESTS PASSED
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
##### Testing packages.
ok archive/tar 0.256s
ok archive/zip 2.070s
ok bufio (cached)
ok bytes 1.624s
ok compress/bzip2 (cached)
ok compress/flate 1.067s
...
์์?
์๋ ์ค
@alexbrainman ์ด๋ฌํ ํ ์คํธ, ํนํ ์ด ๊ฒฝ์ฐ ์ ๋ น ๊ฒฝ๊ณ ์ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์ ์ ์์ต๋๋ค.
๋ ๋ฒ ์คํ๋๋ ํ ์คํธ์ ๊ฒฝ์ฐ ๋น๋์ ๋ํด ๊ทธ๋ฐ ์์ผ๋ก ์ํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. gcc ์ปดํ์ผ๋ก ํ ์คํธ๋ฅผ ํ ๋ฒ ์คํํ ๋ค์ MSVC(ํ์ฑํ๋ ๊ฒฝ์ฐ)๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ๋ ๋๊ตฌ ๋ชจ์์ด ๋ชจ๋ ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ์ฌ๊ธฐ์ ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ผ๋ฏ๋ก MSVC๊ฐ ํ์ฑํ๋ ์ํ์์ all.bat๋ฅผ ํธ์ถํ ๋ MSVC๋ก๋ง ํ ์คํธ๋ฅผ ์คํํ๋๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ ค์ฃผ์ธ์. ์ด ๊ฒฝ์ฐ MSVC๋ก ๋น๋ํ๋ ์ผ๋ถ ๋น๋์ ๋ฌ๋ฆฌ MSVC์ ๋ํด์๋ง ๋น๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
Windows์์ ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ชจ๋ ํ ์คํธํ๋ ค๋ฉด MinGW-W64 ๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ์ฌ ํ๋์ ๋น๋๋ฅผ ์คํํ๊ณ MSVC ๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋น๋๋ฅผ ์คํํด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค.
๋น๋๋ฅผ ์ํด ๊ทธ๋ฐ ์์ผ๋ก ์ํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. gcc ์ปดํ์ผ๋ก ํ ์คํธ๋ฅผ ํ ๋ฒ ์คํํ ๋ค์ MSVC(ํ์ฑํ๋ ๊ฒฝ์ฐ)๋ก ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ๋ ๋๊ตฌ ๋ชจ์์ด ๋ชจ๋ ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
๋ ๋๊ตฌ ์ฒด์ธ์ด ๋ชจ๋ ์๋ ๊ฒฝ์ฐ ๊ธฐ์กด ์ํฌ๋ก๋๋ฅผ ์ค๋จํ์ง ์๋๋ค๋ ๋ณด์ฅ์ด ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ์ ํธ๋๋ ๋์์ด์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
์ด๋ฌํ ํ ์คํธ, ํนํ ์ด ๊ฒฝ์ฐ ์ ๋ น ๊ฒฝ๊ณ ์ ๋ํ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์ ์ ์์ต๋๋ค.
Go ๋ช ๋ น์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ์ง ์์ผ๋ฏ๋ก ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์์ผ ํฉ๋๋ค.
๋ํ go env
๋ช
๋ น์ด CC_FOR_CGO ๋ณ์๋ฅผ ํ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. CC_FOR_CGO๊ฐ go ๋น๋ ์๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ CC_FOR_CGO๊ฐ ๋ค๋ฅธ ๊ฒ๋ค๊ณผ ํจ๊ป ํ์๋์ด์ผ ํฉ๋๋ค. CC_FOR_CGO ๋ณ์๊ฐ ์ ๋ง๋ก ํ์ํฉ๋๊น? CC_FOR_CGO=gcc๊ฐ ์๋ ๋ค๋ฅธ ๊ฒ์ ๋ฌด์์
๋๊น?
๋ ๋ฒ ์คํ๋๋ ํ ์คํธ์ ๊ฒฝ์ฐ ๋น๋์ ๋ํด ๊ทธ๋ฐ ์์ผ๋ก ์ํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. gcc ์ปดํ์ผ๋ก ํ ์คํธ๋ฅผ ํ ๋ฒ ์คํํ ๋ค์ MSVC(ํ์ฑํ๋ ๊ฒฝ์ฐ)๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ๋ ๋๊ตฌ ๋ชจ์์ด ๋ชจ๋ ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
๋ง์ ํ
์คํธ์์ gcc๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ํจํค์ง ํ
์คํธ๊ฐ ์ด์ ์์ด ๋ ๋ฒ ์คํ๋๋ ๊ฒ์ ์ฌ๋/์ปดํจํฐ์ ์๊ฐ ๋ญ๋น์
๋๋ค. https://github.com/golang/go/issues/20982#issuecomment -480569880 archive/zip
ํจํค์ง ํ
์คํธ๊ฐ ๋ ๋ฒ ์คํ๋์์์ ์ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ์คํ์ด ํ์ํ์ง ์์ต๋๋ค.
์ด๋ป๊ฒ ์ ๋ ฌํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง run.bat์์ go tool dist test
ํธ์ถ์ ๋์ฒดํ์ฌ MSVC ๋น๋๋ฅผ ํ
์คํธํ๋ ๋ฐ ํ์ํ ํ
์คํธ๋ฅผ ์ ํํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ช ๊ฐ์ง ํน์ ํ
์คํธ๋ง ์ ํํ๋ ๋ฐฉ๋ฒ์ go tool dist test -h
๋ฅผ ์ฐธ์กฐํ์ธ์. @bradfitz ๋ dist ๋ช
๋ น์ MSVC ํน์ ํ
์คํธ๋ฅผ ์คํํ๋๋ก ์ง์ํ๋ ํ๋๊ทธ ๋๋ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก https://go-review.googlesource.com/c/go/+/133946/5 ๊ฐ ๋๋ฅผ ์ํด ์คํ ํ์ผ์ ๋ง๋ค๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, gcc๋ก ์คํ ํ์ผ์ ๋น๋ํ ์ ์์ต๋๋ค.
c:\Users\Alex\dev\src\issue\go\20982\hello>type *
hello.c
#include <stdio.h>
extern void hello()
{
printf("Hello World from C");
}
hello.go
package main
/*
extern void hello();
*/
import "C"
import "fmt"
func main() {
fmt.Println("Hello from Go!")
C.hello()
}
c:\Users\Alex\dev\src\issue\go\20982\hello>go build
c:\Users\Alex\dev\src\issue\go\20982\hello>hello
Hello from Go!
Hello World from C
c:\Users\Alex\dev\src\issue\go\20982\hello>
๊ทธ๋ฐ ๋ค์ MSVC๋ก ์คํ ํ์ผ์ ๋น๋ํ ์ ์์ต๋๋ค.
c:\Users\Alex\dev\src\issue\go\20982\hello>%GOVSVARSPATH%
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
c:\Users\Alex\dev\src\issue\go\20982\hello>set CC=cl
c:\Users\Alex\dev\src\issue\go\20982\hello>go build
# issue/go/20982/hello
hello.c
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt\stdio.h(948): warning C4710: 'int printf(const char *const ,...)': function not inlined
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt\stdio.h(948): note: see declaration of 'printf'
c:\Users\Alex\dev\src\issue\go\20982\hello>hello
Hello from Go!
Hello World from C
c:\Users\Alex\dev\src\issue\go\20982\hello>
๋ฐ๋ผ์ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ MS ๋ฐฐ์น ํ์ผ์ ์คํํ์ฌ ๋ชจ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค(๋ด ์ถ๋ ฅ์ GOVSVARSPATH ์ฐธ์กฐ). ์ด๋ ํ์ค์ด๋ฉฐ Go์ ๊ด๋ จ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ set CC=cl
. ์ถฉ๋ถํ ๊ฐ๋จํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์์ ๋ณผ ์ ์๋ ์ ์ผํ ๋ฌธ์ ๋ MSVC ์ฌ์ฉ์๊ฐ ์ฌ์ ํ gcc๋ฅผ ์ค์นํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. gcc๋ cmd/cgo์์ ๋ชจ๋ C ์ธํฐํ์ด์ค๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ถ๋ถ์ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์ง ์์ต๋๋ค. cmd/cgo๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ชจ๋ฅด๋ ์ฌ๋๋ค์๊ฒ๋ ์ด์ํ๊ฒ ๋ค๋ฆฌ์ง๋ง ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง์ ๋๋ค.
@ianlancetaylor ์ @bradfitz ๊ฐ ์ด ๋ชจ๋ ๊ฒ์ ์ถ์งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ค๋ฆฌ๋์? ์ด๊ฒ์ go1.13์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ผ ํฉ๋๊น?
MSVC๊ฐ ์ด๋ฏธ ์ค์น๋ ๋น๋๋ ๋ชจ๋ ์ ์ฝ๋๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋น๋๋ ํ ์คํธ๋ฅผ ๊ฑด๋๋ธ ๊ฒ์ ๋๋ค.
์๋ ์ค
gcc๋ cmd/cgo์์ ๋ชจ๋ C ์ธํฐํ์ด์ค๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ถ๋ถ์ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์ง ์์ต๋๋ค.
์ด๋ป๊ฒ ๊ทน๋ณตํ ์ ์์ต๋๊น? ์ด์์ ์ผ๋ก๋ gcc์ ๋ํ ์๊ตฌ ์ฌํญ์ด ์๊ณ MSVC๋ง ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ด๋ป๊ฒ ๊ทน๋ณตํ ์ ์์ต๋๊น?
gcc๋ฅผ ์ฌ์ฉํ๋ cmd/cgo์ ์ผ๋ถ๋ MSVC๋ฅผ ์ฌ์ฉํ๋๋ก ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค. ํน์ ๊ฐ๋ฅํ๋ค๋ฉด.
์๋ ์ค
์ด ๊ธฐ๋ฅ์ด ํ๋ก๋์ ๋จ๊ณ์ ๋ ๊ฐ๊น์ด์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด 1.13์ ๋ํด ํ๊ทธ๊ฐ ๋ถ์ ๊ฒ์ ๋ณด์๊ณ ๋ฐฉ๊ธ ๋์์ต๋๋ค. ํ์ฅ ์ฝ๋์ ์ฐ๊ฒฐ๋ Go c-archive ๋น๋๋ฅผ ์ฌ์ฉํ์ฌ Python ํ์ฅ์ ๋น๋ํ๋ ค๊ณ ํ๋๋ฐ Python์๋ MSVC๊ฐ ํ์ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ์ํ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ถ์๋ถํฐ ์ถ์๊น์ง ์์ผ๋ก ์ซ๊ฒจ๋ฌ์ผ๋ ๋ฌด๊ณํ์ผ๋ก ์ฎ๊ธฐ๋๋ก ํ๊ฒ ์ต๋๋ค. 1.14์ ๋ค์ด๊ฐ๋ฉด ํ๋ฅญํฉ๋๋ค.
์ด์ค ์ปดํ์ผ๋ฌ ์๊ตฌ ์ฌํญ์ด ์๋๋ผ๋ ํ์ฌ ๊ตฌํ์ด ๋ค์ ๋ฆด๋ฆฌ์ค์ ์ ์ฉ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ต์ํ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ํ์ผ/๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ปดํ์ผํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ด๋ ์๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
์ด์ค ์ปดํ์ผ๋ฌ ์๊ตฌ ์ฌํญ์ด ์๋๋ผ๋ ํ์ฌ ๊ตฌํ์ด ๋ค์ ๋ฆด๋ฆฌ์ค์ ์ ์ฉ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ข์ "๋ฒ ํ" ๊ตฌํ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฒ๊ทธ๊ฐ ์ ๊ฑฐ๋๊ณ ๊ตฌํ์ด ์ฑ์ํ๊ธฐ ์์ํ ์ ์์ต๋๋ค. ์ง์งํ ๊ฒํ ๋ฅผ ๊ฑฐ์น๊ธฐ ์ ์ ํด์ผ ํ ์ผ์ ๋ฌด์์ ๋๊น?
๊ทธ๋์ ๋ด ๊ด์ ์์ ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์ด๊ฒ์ ๋ง์ง๋ง์ผ๋ก ๋ดค์ ๋(~6๊ฐ์ ์ ) ๊ธฐ์ตํ ์ ์๋ ๊ฒ์ ์ฝ๋ ๊ฒํ ํ๋ก์ธ์ค๋ฅผ ์ํด ์๋ฃํด์ผ ํ๋ 12๊ฐ ์ ๋์ ์ ๋ฆฌ ํญ๋ชฉ์ด ์์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋๊ตฌ ์ฒด์ธ๊ณผ ํจ๊ป ์๋ํ๊ธฐ ์ํด ์์ฃผ ์ฝ๊ฐ์ ์์ ์ผ๋ก ๋ณต์ฌ๋ ์ผ๋ถ ํ ์คํธ์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ค๋ฉด ์ถ๊ฐ ์์ ์ด ํ์ํ ์๋ ์์ต๋๋ค. ๋ํ ํน์ msvc ๊ฒฝ๊ณ ๋ฅผ ๊ฒํ ํ๊ณ ํด์ ํด์ผ ํฉ๋๋ค.
์ฃผ์ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
gcc ์์ด๋ ์ ํ ๋ถ์์ ํ ์ ์์ต๋๋ค. ์ด์ ๋ํ ๊ฐ๋จํ๊ฑฐ๋ ์ฆ๊ฐ์ ์ธ ์๋ฃจ์ ์ ์์ต๋๋ค.
์ค์ ์ ๋ง๋ฌด๋ฆฌํ๊ณ ๋ชจ๋ ๊ฒ์ด ๋น๋๋ฅผ ์ํด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
๋๋ ์ง๋ 6๊ฐ์ ๋์ ์ปดํ์ผ๋ฌ์ ๋ง์ปค์ ์๋นํ ๋ณํ๊ฐ ์์๋ค๊ณ ์๊ฐํ๋๋ฐ ์ด๊ฒ์ด ํ์ฌ ์์ ์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น ์ ์์ง๋ง ๋๋ ๊ทธ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. Go์ ์ปดํ์ผ๋ฌ/๋ง์ปค/๋๊ตฌ ์ฒด์ธ ํ์์ ๋ํ ๋ณต์ก์ฑ๊ณผ ๋์ ํ์ต ๊ณก์ ์ผ๋ก ์ธํด ๋ณ๊ฒฝ ์ฌํญ์ด ์ด ์์ ๋ณธ๋ฌธ์ ๋ฏธ์น๋ ์ํฅ์ ํ์ ํ๊ธฐ์ ์ถฉ๋ถํ ์๋๋ฅผ ๋ด๋ ๋ฐ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๋ณต์์ ์ ํ์ ์ง์๋์ง ์์ต๋๋ค. MSCVs C lib๋ ๋จ์ํ ํธํ๋์ง ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ C++๋ก shimํ๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ํ์คํ์ง ์์ต๋๋ค. ์๋ง๋ MSVC ๋๊ตฌ ์ฒด์ธ์ ์ต์ํ MS์ ๋๊ตฐ๊ฐ๊ฐ ๋ผ์ด๋ค ์ ์์ ๊ฒ์ ๋๋ค.
๋ถํํ๊ฒ๋ ์ถ๊ณผ ๋ค๋ฅธ ํ๋ก์ ํธ๊ฐ ์ด ์ผ์ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋์ง๋ง ์์ผ๋ก ๋ช ์ฃผ ๋์ ์ด ์ผ์ ์๊ฐ์ ํ ์ ํ ๊ฒ์ ๋๋ค.
@manbearian ์ด ๋ฌธ์ ๋
@kesmit13 ๋ฐ @mxplusb
์ด๊ฒ
https://go-review.googlesource.com/c/go/+/133946/5
์๋ํ๋ @cchamplin ์ต์ ์ฝ๋์ ๋๋ค.
์ฝ๋์ ๋ํ ๋์ ํ์ฌ ๊ด์ฌ์ฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ถ๋ถ๋ช ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ค ๋ช ๋ น์ ์คํํฉ๋๊น? ๋ด ํ๊ฒฝ์ ์ด๋ป๊ฒ ์ค์ ํด์ผ ํฉ๋๊น?
๋ค์ ๋จ๊ณ๋ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ์ฝ๋๋ฅผ ์ฌ์ฉํด ๋ณด๊ณ ์ค์ ๋ก ์ฌ์ฉํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋จ๊ณ๋ฅผ ๋ฌธ์ํํด์ผ ํฉ๋๋ค. ๋๋ฌด ๋ณต์กํ๊ฑฐ๋ ์๋ํ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์กฐ์ ํด์ผ ํฉ๋๋ค.
์ฝ๋์ ํ์ฌ ์ํ๊ฐ ๋ง์กฑ์ค๋ฌ์ฐ๋ฉด ๋ง์คํฐ๋ก ๋ค์ ๋ฒ ์ด์คํด์ผ ํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ด ์กฐ์ ๋ ํ์ผ์ด ๋๋ฌด ๋ง์ ๋ฆฌ๋ฒ ์ด์คํ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์กฐ์ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ผ ์ ์์ผ๋ฏ๋ก ๋ ์ฝ๊ฒ ๋ฆฌ๋ฒ ์ด์คํ ์ ์์ต๋๋ค.
์๋ ์ค
@mxplusb @kesmit13 ํ์ฌ ๊ตฌํ์ ๋ง์คํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ๋ฉฐ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค. https://go-review.googlesource.com/c/go/+/133946/6
@alexbrainman
์ฝ๋์ ๋ํ ๋์ ํ์ฌ ๊ด์ฌ์ฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ถ๋ถ๋ช ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ค ๋ช ๋ น์ ์คํํฉ๋๊น? ๋ด ํ๊ฒฝ์ ์ด๋ป๊ฒ ์ค์ ํด์ผ ํฉ๋๊น?
์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ด๋์ ๋ฃ์ด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๊ฐ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์. MSVC๋ฅผ ํตํด ๋น๋/์คํํ๊ธฐ ์ํด cmd/go ๋ฌธ์ ์๋์ ์์ด์ผ ํ๋์ง, ์๋๋ฉด CGO ๋ฌธ์ ์๋์ ์์ด์ผ ํ๋์ง, ์๋๋ฉด ์์ ํ ๋ค๋ฅธ ๊ณณ์ ์์ด์ผ ํ๋์ง ์ ์ ์์ต๋๋ค.
๋ง์ ํ ์คํธ์์ gcc๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ํจํค์ง ํ ์คํธ๊ฐ ์ด์ ์์ด ๋ ๋ฒ ์คํ๋๋ ๊ฒ์ ์ฌ๋/์ปดํจํฐ์ ์๊ฐ ๋ญ๋น์ ๋๋ค. #20982 (comment) archive/zip ํจํค์ง ํ ์คํธ์์ ๋ณผ ์ ์๋ฏ์ด ๋ ๋ฒ ์คํํ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ป๊ฒ ์ ๋ ฌํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง run.bat์์ go tool dist test ํธ์ถ์ ๋์ฒดํ์ฌ MSVC ๋น๋๋ฅผ ํ ์คํธํ๋ ๋ฐ ํ์ํ ํ ์คํธ๋ง ์ ํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ถ ํน์ ํ ์คํธ๋ง ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ go tool dist test -h๋ฅผ ์ฐธ์กฐํ์ญ์์ค. @bradfitz ๋ dist ๋ช ๋ น์ MSVC ํน์ ํ ์คํธ๋ฅผ ์คํํ๋๋ก ์ง์ํ๋ ํ๋๊ทธ ๋๋ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์๋ ์ด๋ฏธ dist์ ์ถ๊ฐ๋ ํ๊ฒฝ ๋ณ์๊ฐ ํฌํจ๋์ด ์์ด ์ฐ๋ฆฌ๊ฐ "GO_TEST_TESTINGMSVC"๋ผ๋ MSVC ์์ ์ ์ํํ๊ณ ์์์ ์๋ฆฝ๋๋ค. ๋ด๊ฐ ํ์ ํ ์ ์๋ ๊ฒ์ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์คํํ์ง ์๋ ๊ฒฝ์ฐ MSVC๋ง์ด ์ํฅ์ ๋ฏธ์น ์ ์๋ ํญ๋ชฉ์ผ๋ก ํ ์คํธ๋ฅผ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ์ฌ์ ์ผ๋ก CGO ๊ด๋ จ ํ ์คํธ๋ก ์ ํํ ์ ์์ง๋ง CGO ํ ์คํธ๊ฐ ๋์ฒ์ ์๊ณ dist์ ์ด๋ฌํ ํ ์คํธ๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๋ฉ์ปค๋์ฆ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๋์ ๋ฃ์ด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๊ฐ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ์ฌ๊ธฐ์์ MSVC๋ก Cgo ์ฝ๋๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. @mxplusb ๋ฐ @kesmit13 ์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด gcc๋ฅผ ์ฌ์ฉํ์ฌ Cgo ์ฝ๋๋ฅผ ๋น๋ํ๋ ค๋ฉด
%GOROOT%\src
๋๋ ํ ๋ฆฌ์์ make.bat๋ฅผ ์คํํ์ฌ ๋จผ์ Go ๋น๋go build
๋ฐ go install
๋ช
๋ น ์ฌ์ฉMSVC๋ก ๋์ผํ ์์ ์ ์ํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๋ด๊ฐ ํ์ ํ ์ ์๋ ๊ฒ์ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์คํํ์ง ์๋ ๊ฒฝ์ฐ MSVC๋ง์ด ์ํฅ์ ๋ฏธ์น ์ ์๋ ํญ๋ชฉ์ผ๋ก ํ ์คํธ๋ฅผ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ์ฌ์ ์ผ๋ก CGO ๊ด๋ จ ํ ์คํธ๋ก ์ ํํ ์ ์์ง๋ง CGO ํ ์คํธ๊ฐ ๋์ฒ์ ์๊ณ dist์ ์ด๋ฌํ ํ ์คํธ๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๋ฉ์ปค๋์ฆ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
%GOROOT%\misc\cgo ๋๋ ํ ๋ฆฌ๋ก ์์ํ๊ฒ ์ต๋๋ค. ๊ฑฐ๊ธฐ์ ๋น๋ํ ์ ์๋ ์์ค๊ฐ ๋ฌด์์ด๋ ๋น๋ํด์ผ ํฉ๋๋ค. ๊ทธ ์ด์์ ๊ฒ์ ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
์๋ ์ค
@cchamplin ์ง์ฐ์ ๋ํด ์ฃ์กํฉ๋๋ค. ์ด๋ฒ ์ฃผ์ ์ต์ ์ ๋คํด ํ ์คํธํ๊ณ ์งํ ์ํฉ์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์, ํํฐ์ ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค... MSVC ๊ธฐ๋ฅ์ ๋ํ ์ง๋ฌธ์ ๋ตํ๊ฑฐ๋ ๊ฐ๋ฅํ ์ฌ๋๋ค์๊ฒ ์๋ดํด ๋๋ฆด ์ ์์ต๋๋ค. ๋ํ๋ฅผ ์ฝ์์ง๋ง ๋ถํํ๋ MSVC์์ ๋๋ฝ๋๊ฑฐ๋ ๋๋ฝ๋์ง ์์ GCC ๊ธฐ๋ฅ์ ์ดํดํ๋ ๋ฐ ์ต์ํ์ง ์์ต๋๋ค.
์๋
์ฌ๋ฌ๋ถ,
์ด ๊ธฐ๋ฅ์ด Go 1.14์์ ์ถ์๋์์ต๋๊น?
๊ณต๊ฐ๋๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌธ์๋ฅผ ๊ณต์ ํ์ญ์์ค.
์์ง ์ถ์๋์ง ์์๋ค๋ฉด ์ธ์ ์ถ์๋ ์ง์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
MSVC ์ง์์ ๊ฐ์ ํ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค :)
์๋ ํ์ธ์, ์ถ๊ฐ ์ ๋ณด์ ๋ํ ์ ์์ฒญ์ ์๋ฌด๋ ์๋ตํ์ง ์์์ผ๋ฏ๋ก ๋ฌด์์ด ํ์ํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๊ตฐ๊ฐ ์ ๋ฅผ ์ฑ์์ฃผ์๊ฒ ์ต๋๊น?
๋ถํํ๋ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฌธ์ ์ ๋ํด ์ ๊ทน์ ์ผ๋ก ๋ ธ๋ ฅํ๊ณ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์, ๋ ๋ง์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ๋ด ์์ฒญ์ ์๋ฌด๋ ์๋ตํ์ง ์์์ต๋๋ค. ...
์๋ ํ์ธ์ @manbearian
์ด๋ค ์์ฒญ์ ๋๊น? ์ด๋ค ์ ๋ณด๊ฐ ํ์ํฉ๋๊น?
์๋ ์ค
๋๋ ์ ๋ณด๋ฅผ ์ํด ์ด ์ค๋ ๋์ ์๋ถ๋ถ์ ํ๊ทธ๊ฐ ์ง์ ๋์์ง๋ง ์ฌ๋๋ค์ด ๋ฌด์์ ์ฐพ๊ณ ์๋์ง ๋ชจ๋ฅด๊ณ ๋์์ ์ค ์ ์์์ต๋๋ค. ๋์์ด ํ์ํ์ง ์๋ค๋ฉด ์ข์ต๋๋ค. ์๋ ค์ฃผ์ธ์.
์๋ ค์ฃผ์ธ์.
@๋ง๋ฒ ๋ฆฌ์
์ ์ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๊ฐ ๋น์ ์ ํ๊ทธํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฌ์ ํ ๋์์ด ํ์ํ๋ฉด ๋ค์ ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
์๋ ์ค
์์ง ์ถ์๋์ง ์์๋ค๋ฉด ์ธ์ ์ถ์๋ ์ง์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
MSVC ์ง์์ ๊ฐ์ ํ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
@dhinesherode91
์ฝ๋๊ฐ ์๊ณ ์์ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ์ ๋ง๋ก ๋ง๊ณ ์๋ ์ ์ผํ ๊ฒ์ ์ฌ๋๋ค์ด ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ๊ทธ๋ค์ด ์ ์ ํ๊ฒ ๊ฒํ ๋๊ณ ์น์ธ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ๋๋ ํ์ฌ ๋ง์คํฐ ์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฆฌ๋ฒ ์ด์คํ๋ ๊ฒ์ ์ฃผ์ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ 5-6๋ฒ ํ๊ณ ๋งค์ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ํ ์คํธ/ํผ๋๋ฐฑ์ ๋ฐ์ง ๋ชปํ์ต๋๋ค. ์ถ๊ฐ ๋น์ฌ์๊ฐ ์ด ํ ์คํธ์ ๊ธฐ๊บผ์ด ์ฐธ์ฌํ์ง ์๋ ํ ๋ฌธ์ ๋ ๋ฌผ์ ์ ๊ธธ ์ ์์ต๋๋ค.
์ถ๊ฐ ๋น์ฌ์๊ฐ ์ด ํ ์คํธ์ ๊ธฐ๊บผ์ด ์ฐธ์ฌํ์ง ์๋ ํ ๋ฌธ์ ๋ ๋ฌผ์ ์ ๊ธธ ์ ์์ต๋๋ค.
@cchamplin ์ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธ/๋๋ฒ๊น ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ ๋ ํด์ฒด์ธ์ ๋ํ ๊ฒฝํ์ด ์์ง๋ง ๊ทํ์ ์ปค๋ฐ์ ๊ฒํ ํ ๊ฒฐ๊ณผ ๊ฝค ๊ตฌ์กฐํ๋๊ณ ๋ฌธ์ํ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@cchamplin ๊ตฌํ ๋ถ๋ถ์ด ์๋ฃ๋์๋ค๋ ์์์ ๋ฃ๊ฒ ๋์ด
ํ
์คํธ ๋ถ๋ถ์ ์ฐธ์ฌํ๋ ๋ฐ ๊ด์ฌ์ด ์์ง๋ง GoLang์ ์ด๋ณด์์ด์ Windows api(๋ช ์ฃผ ์ ์ ์์)์ ์ข์ ํ์ต์์ด๊ธฐ๋ ํฉ๋๋ค. ๋ง์ ๊ณต์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก MS C++์์ Windows API๋ก ์์
ํ ๊ณํ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ค์ ๋๋ ๋ค์ค ํ๋ซํผ ์์คํ
ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ ์ ์๋ ์ธ์ด(๋ด ์์คํ
ํ๋ก๊ทธ๋๋ฐ์ฉ)๋ฅผ ์ฐพ๊ธฐ ์์ํ๊ณ GoLang์ ๊น์ ์ธ์์ ๋ฐ์์ต๋๋ค. ํญ์ ๋ด ์ชฝ์์ ๊ณตํํ ์ค๋น๊ฐ ๋์ด ์๊ณ ๋ง์ ์ง๋๊ฐ ํ์ํฉ๋๋ค.
@cchamplin ๋ฆฌ๋ฒ ์ด์คํ๋ฉด ๊ทธ ์์ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค. ์ง์ฅ์์ ์ผ๋ถ ํ๋ก์ ํธ์์ mingw64 ์๊ตฌ ์ฌํญ์ ์ญ์ ํ๊ณ ์ถ์ต๋๋ค. ๋ด ๋น๋ ๋๊ตฌ๋ ๋ชจ๋ MSVC์ฉ์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฏ๋ก ํจ์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
@cchamplin ๋ํ ๊ทํ์ CL์ ์ดํด๋ณด์์ง๋ง cgo ๋๊ตฌ์ ๋ํ ํญ๋ชฉ์ด ์์์ผ๋ฏ๋ก ์์ฒด ํจ์น๋ฅผ ์์ํ์ต๋๋ค. ์ฌ์ ์์ ์ด ์์ต๋๊น?
@ericlagergren
@cchamplin ๋ํ ๊ทํ์ CL์ ์ดํด๋ณด์์ง๋ง cgo ๋๊ตฌ์ ๋ํ ํญ๋ชฉ์ด ์์์ผ๋ฏ๋ก ์์ฒด ํจ์น๋ฅผ ์์ํ์ต๋๋ค. ์ฌ์ ์์ ์ด ์์ต๋๊น?
https://go-review.googlesource.com/c/go/+/133946/6์์ ๋ง์ ๊ด๋ จ ์ปค๋ฐ์ด ์ด๋ ์ ๋ Go์ cgo ๋ถ๋ถ์ ์ง์ ๋ง์ง๋์ง ์ดํดํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
@ccahoon ์์์ด, ๋ด๊ฐ ๋์น ๊ฒ ํ๋ฆผ์์ด. cgo ๋๊ตฌ๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ๊ฒ ๋ค๊ณ ์ ์ํ์ ๊ฒ์ ๋๋ค.
@ericlagergren
์ง์ฅ์์ ์ผ๋ถ ํ๋ก์ ํธ์์ mingw64 ์๊ตฌ ์ฌํญ์ ์ญ์ ํ๊ณ ์ถ์ต๋๋ค.
์ฐธ๊ณ ๋ก. NS
https://go-review.googlesource.com/c/go/+/133946/6
๋ณ๊ฒฝํ๋ ค๋ฉด ์ฌ์ ํ Mingw๊ฐ ์๋ํด์ผ ํฉ๋๋ค. @cchamplin ๋ณ๊ฒฝ์ ์ฌ์ฉํ๋ ค๋ฉด Mingw ๋ฐ MSVC ๋๊ตฌ๊ฐ ๋ชจ๋ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
์๋ ์ค
@cchamplin , Mingw๊ฐ ์ฌ์ ํ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด ์ข ์์ฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ๋ฌด์์ด ํ์ํฉ๋๊น?
@alexbrainman ๋ง์ ๊ทธ๊ฒ์ ๋จ์ด ๋จ๋ฆฌ๋ฉด ํ์์ ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ @cglong์ด ๋งํ๋ฏ์ด ์ด๊ฒ์ด ์ mingw64๊ฐ ํ์ํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@ericlagergren @cglong CGO๋ ์ปดํ์ผ๋๋ C ์ฝ๋์ ๋ํ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํ ์ ๋ณด๋ฅผ ์์งํ๊ณ ๋ณด์ ํด์ผ ํฉ๋๋ค. GCC์๋ ํธ๋ฆฌํ๊ฒ ๊ตฌ๋ฌธ ๋ถ์ ๊ฐ๋ฅํ ํ์์ผ๋ก ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ํ๋๊ทธ๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์๋ ํ MSVC์๋ ๋์ผํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. go์์ ๋๊ตฌ๋ฅผ ๋น๋ํ๋ ค๋ฉด C ๋ฐ C++ ์ฝ๋๋ฅผ lex/parseํ๋ ์ฝ๋๋ฟ๋ง ์๋๋ผ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ์ ์ดํดํ๊ณ ํ๊ฐํ๋ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. Go์์ ๊ทธ๋ฌํ ๊ฒ์ ๊ตฌ์ถํ๋ ๊ฒ์ ์๋นํ ํฐ ์ฌ์ ์ด ๋ ๊ฒ์ ๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ์ฑํํ๋ ๋ฐฉ๋ฒ์ ์์๋ผ ์ ์์ง๋ง ์ด๋๊ฐ์ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๊น?
@cchamplin ์ก์๋ค, ๊ทธ๊ฒ ๋ด๊ฐ ์๊ฐํ ๊ฒ์ ๋๋ค. libclang ๋ฐ cznic/cc์ ๊ฐ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถํํ๋ libclang์ ๊ฑฐ๋ํ๊ณ cznic/cc๋ Windows ๋๋ macOS์์ ํ ์คํธ๋์ง ์์์ต๋๋ค. PDB๋ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์์ต๋๊น?
CGO๋ ์ปดํ์ผ๋๋ C ์ฝ๋์ ๋ํ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํ ์ ๋ณด๋ฅผ ์์งํ๊ณ ๋ณด์ ํด์ผ ํฉ๋๋ค. GCC์๋ ํธ๋ฆฌํ๊ฒ ๊ตฌ๋ฌธ ๋ถ์ ๊ฐ๋ฅํ ํ์์ผ๋ก ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ํ๋๊ทธ๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์๋ ํ MSVC์๋ ๋์ผํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
์๋ง๋ @manbearian ์ด ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ํฌ์ธํฐ๋ฅผ ์ ๊ณตํ ์ ์์๊น์?
GCC๊ฐ ์ถ๋ ฅ ์ ํ ๋ฐ์ดํฐ๋ฅผ ํน๋ณํ ํ์์ผ๋ก ๋ด๋ณด๋ธ๋ค๊ณ ๋งํ์ง๋ ์๊ฒ ์ต๋๋ค. ๋๋ฒ๊ฑฐ์ฉ DWARF ๋๋ฒ๊น ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๊ณ cgo๋ debug/dwarf ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. MSVC์๋ ๋๋ฒ๊ทธ ํ์๋ ์์ ์ ์์ต๋๋ค. ํด๋น ํ์์ด ์ด๋์๋ ๋ฌธ์ํ๋์ด ์์ผ๋ฉด DWARF ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ ๊ฒ์ฒ๋ผ cgo๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์ ์ ์์ต๋๋ค.
@ianlancetaylor MSVC๋ PDB ํ์ผ์ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. https://github.com/Microsoft/microsoft-pdb ์ฐธ์กฐ
FWIW, MSVC์ ๋๋ฒ๊ทธ ์ถ๋ ฅ์ ์ฝ๋ ๊ฒ์ ๋ด๊ฐ https://github.com/golang/go/issues/20982#issuecomment -648462003์์ cgo ๋๊ตฌ๋ฅผ ์ธ๊ธํ ๋ ๋งํ ๊ฒ์ ๋๋ค.
GCC๊ฐ ์ถ๋ ฅ ์ ํ ๋ฐ์ดํฐ๋ฅผ ํน๋ณํ ํ์์ผ๋ก ๋ด๋ณด๋ธ๋ค๊ณ ๋งํ์ง๋ ์๊ฒ ์ต๋๋ค. ๋๋ฒ๊ฑฐ์ฉ DWARF ๋๋ฒ๊น ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๊ณ cgo๋ debug/dwarf ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. MSVC์๋ ๋๋ฒ๊ทธ ํ์๋ ์์ ์ ์์ต๋๋ค. ํด๋น ํ์์ด ์ด๋์๋ ๋ฌธ์ํ๋์ด ์์ผ๋ฉด DWARF ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ ๊ฒ์ฒ๋ผ cgo๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์ ์ ์์ต๋๋ค.
@ericlagergren @ianlancetaylor
๊ทธ๋์ ์ฐ๋ฆฌ๋ DWARF ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉฐ, ์ด๋ ๊ทธ๊ฒ์ ํฐ ๋ถ๋ถ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ก ์ ์ผ๋ก PDB ๋ฐ์ดํฐ์์ ๋์ผํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ด๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ธ๊ธํ ๊ฒ์ GCC๊ฐ ์์ฑํ๋ DWARF ๋ฐ์ดํฐ๋ฟ๋ง ์๋๋ผ ์ ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ ํ ๋ชจ๋ #define์ ์ถ๋ ฅํ๋ gcc -E -dM์ ์ถ๋ ฅ์ ๋๋ค. PDB๊ฐ ์์ฒด์ ์ผ๋ก ๋์ผํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค...์ ๊ฐ ํ์์ ์ธ ๊ฒ์ ์ค์ ๋ก ์ปดํ์ผํ ํ์ ์์ด MSVC๊ฐ ๋๋ฒ๊ทธ ์ ๋ณด/์ ํ ์ ๋ณด๋ฅผ ์ด๋ค ์ฉ๋์ผ๋ก๋ ๋คํํ๋๋ก ๊ฐ์ ํ ์ ์๋์ง ์ฌ๋ถ์ ๋๋ค. ์ฝ๋. ์ง๊ธ CGO๋ GCC๋ก ๋ฐ๋ก ๊ทธ ์ผ์ ํ๊ณ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ์์ /EP /d1PP๋ -E -dM๊ณผ ์ ์ฌํ ๊ฒ์ ๋ฐฉ์ถํด์ผ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ์์ /EP /d1PP๋ -E -dM๊ณผ ์ ์ฌํ ๊ฒ์ ๋ฐฉ์ถํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด /d1PP๊ฐ ๋ฌธ์ํ๋์ง ์์ ํ๋๊ทธ๋ผ๊ณ ๊ฐ์ ํฉ๋๊น? ๋๋ ๊ทธ๊ฒ์ ์ ์ ๋ณธ ์ ์ด ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ฏธ๋ฆฌ ๋๋ฑํ ์ ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
@cchamplin ์, ๋ฌธ์ํ๋์ง
๋๊ตฐ๊ฐ ๋์๊ฒ MSVC ์ง์์ ํ์ฌ ์ํ์ ๋ํ ๊ฐ๋ตํ ์์ฝ์ ์ ๊ณตํ ์ ์์ต๋๊น? ๋๋ ์ด ๋ชจ๋ ์ ์์ค ์ปดํ์ผ๋ฌ์ ๋ด์ฉ์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. C#/UWP์์ ์ฌ์ฉํ๋ ค๋ go ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ณ ์ด๋ฏธ go build ๋ฐ buildmode c-shared์์ ์๋ํ๊ณ ์์ต๋๋ค. ํ์ง๋ง: go์์ ์์ฑ๋ DLL์ด MSVC ๋๊ตฌ ์ฒด์ธ์์๋ง ์ค์ ํ ์ ์๋ ์ผ๋ถ ์ปดํ์ผ๋ฌ/๋ง์ปค ํ๋๊ทธ๋ฅผ ๋์น๊ธฐ ๋๋ฌธ์ ํด๋น ์ฑ์ Windows Store์์ ํ์ฉ๋์ง ์์ต๋๋ค.
๊ทธ๋์: ์ฌ๊ธฐ์ ์ด๊ฒ์ ์ด๋ป๊ฒ ํ ์คํธํ ์ ์์ต๋๊น? ๋ชจ๋ ์กฐ์ธ์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! ๊ฐ์ฌํฉ๋๋ค!
go์์ ์์ฑ๋ DLL์ด MSVC ๋๊ตฌ ์ฒด์ธ์์๋ง ์ค์ ํ ์ ์๋ ์ผ๋ถ ์ปดํ์ผ๋ฌ/๋ง์ปค ํ๋๊ทธ๋ฅผ ๋์น๊ธฐ ๋๋ฌธ์ ํด๋น ์ฑ์ Windows Store์์ ํ์ฉ๋์ง ์์ต๋๋ค.
@TopperDEL ์ Windows Store์์ ๋๋ฝ๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์๋ ค์ค๋๊น? mingw-64๊ฐ ์ง์ํ๋ ๊ฒฝ์ฐ dll์ ๋น๋ํ ๋ ํญ์ ์ฌ๋ฐ๋ฅธ ํ๋๊ทธ์ ํจ๊ป -extldflags
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@qmuntal ์, ๋ค์์ ์ํํฉ๋๋ค.
"์ฑ์ ์ฐ๊ฒฐํ ๋ ํ์ํ ๋ง์ปค ์ต์
์ธ SAFESEH, DYNAMICBASE, NXCOMPAT ๋ฐ APPCONTAINER๋ฅผ ์ ์ฉํ์ญ์์ค."
๋๋ ์ด๋ฏธ ์๋ํ๋ค
go build -ldflags="-s -w '-extldflags=-Wl,--dynamicbase,--high-entropy-va'" -o storj_uplink.dll -buildmode c-shared
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์์ ์ ์ถ๊ณผ ๊ด๋ จํ์ฌ ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด ์ดํด์์ ์ ์ด๋ SAFESEH๋ MSVC ์ ์ฉ์ ๋๋ค. ๋ง์ต๋๊น?
"์ฑ์ ์ฐ๊ฒฐํ ๋ ํ์ํ ๋ง์ปค ์ต์ ์ธ SAFESEH, DYNAMICBASE, NXCOMPAT ๋ฐ APPCONTAINER๋ฅผ ์ ์ฉํ์ญ์์ค."
Mingw-w64์์ SAFESEH ๋๋ APPCONTAINER ํ๋๊ทธ๋ฅผ ํ์ฑํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ง๋ ์ด ํ๋ก์ ํธ https://github.com/status-im/mingw-windows10-uwp์์ ์ง์นจ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ DYNAMICBASE ๋ฐ NXCOMPAT์ go 1.16(#41421 ์ฐธ์กฐ)์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ง๋ง ์ธ๊ธํ ๋๋ก ์ด๋ฏธ -extldflags
์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ค ์ ๋ ์ผ๋ถ ํ๋ก์ ํธ์์ ๊ทธ๋ ๊ฒ ํ๊ณ ์์ต๋๋ค.
@qmuntal ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๋์ ์ ์ด๋ ์์ extldflags๊ฐ ๋ง์์ผํฉ๋๊น?
Windows 10-uwp์ฉ mingw๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์ค๋ ๋์ ๋งจ ์๋์์ ๋ณด๋ฉด MSVC ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ๋ MSVC ํ์ ์์ต๋๋ค. github ๋๋ ์ด๋ฉ์ผ([email protected])์์ ์ ์๊ฒ ํ์ ๋ณด๋ด์ฃผ์ธ์.