Go: cmd/link: msvc ๊ฐœ์ฒด ํŒŒ์ผ ์ง€์›

์— ๋งŒ๋“  2017๋…„ 07์›” 11์ผ  ยท  222์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

go ๋ง์ปค๋Š” ํ˜„์žฌ msvc ๊ฐœ์ฒด ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด ๋ฌธ์ œ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์„ ์ˆ˜ ์žˆ์Œ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows ์›Œํฌํ”Œ๋กœ๋ฅผ ๋‹ค์†Œ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•œ์ง€ ๋ฐ/๋˜๋Š” ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Builders FeatureRequest NeedsInvestigation OS-Windows

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ์Šค๋ ˆ๋“œ์˜ ๋งจ ์•„๋ž˜์—์„œ ๋ณด๋ฉด MSVC ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ €๋Š” MSVC ํŒ€์— ์žˆ์Šต๋‹ˆ๋‹ค. github ๋˜๋Š” ์ด๋ฉ”์ผ([email protected])์—์„œ ์ €์—๊ฒŒ ํ•‘์„ ๋ณด๋‚ด์ฃผ์„ธ์š”.

๋ชจ๋“  222 ๋Œ“๊ธ€

/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 ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” .go ํŒŒ์ผ(๋‹น์‹œ 1๊ฐœ ํŒจํ‚ค์ง€)์„ %GOPATH%/pkg ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐœ์ฒด ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • %GOPATH%/pkg ์•„๋ž˜์˜ ๊ฐœ์ฒด ํŒŒ์ผ์—์„œ ์ตœ์ข… .exe ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” ๋ง์ปค.

๋•Œ๋•Œ๋กœ(ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ 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);
}

๋‚˜๋Š” ์กฐ๋ฆฝ์— ๋Œ€ํ•ด ์ „ํ˜€ ์ต์ˆ™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ณผ์†Œํ‰๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • [x] ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ ์ดํ•ด
  • [x] MSVC ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ํฌํŠธ
  • [x] _beginthread ๋Œ€ CreateThread ์ดํ•ด
  • [x] CreateThread๋กœ ์ „ํ™˜

๋˜ํ•œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ธฐํ˜ธ:

  • [x] timeBeginPeriod --> winmm.lib
  • [x] timeBeginPeriod
  • [x] WSAGetOverlappedResult --> Ws2_32.lib
  • [x] WSAGetOverlapped ๊ฒฐ๊ณผ
  • [x] _cgo_18b6f6fc815b_Cfunc_hello
  • [x] x_cgo_init --> msvc_windows_amd64.c
  • [x] x_cgo_thread_start --> msvc_windows_amd64.c
  • [x] x_cgo_sys_thread_create --> msvc_windows_amd64.c
  • [x] x_cgo_notify_runtime_init_done --> gcc_libinit_windows.c
  • [x] x_cgo_set_context_function --> gcc_libinit_windows.c

์ข‹์•„, ์˜ˆ์ƒ๋ณด๋‹ค ๋นจ๋ฆฌ ์—ฌ๊ธฐ๋กœ ์ด๋™ํ•ด!

์ „์ฒด: 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 ์ข…์†์„ฑ์„ ์ตœ์ข… ํ”„๋กœ๊ทธ๋žจ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์Œ ๊ฐœ์ฒด๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

  • go.o : ๋ถ„๋ช…ํžˆ go ๋„๊ตฌ ์ฒด์ธ์—์„œ
  • _cgo_.o : gcc์—์„œ ์ƒ์„ฑ, ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • 000000.o : gcc์— ์˜ํ•ด ์ƒ์„ฑ, ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • 000001.o : ์—…๋ฐ์ดํŠธ: ์‹ค์ œ๋กœ go ๋ง์ปค์— ์˜ํ•ด ์ƒ์„ฑ๋˜์ง€๋งŒ 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 ํด๋” ์—์„œ ๋‹ค์Œ ํŒŒ์ผ์„ ๋ณต์‚ฌ

  • gcc_amd64.S
  • gcc_fatalf.c
  • gcc_libinit_windows.c
  • gcc_util.c
  • gcc_windows_amd64.c
  • libcgo.h

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๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์— ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์•Œ๋ ‰์Šค

์ž, ์ด์ œ ๋‹ค์Œ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • libgo.lib
  • ์ฐ๋“ ์ฐ๋“ ํ•œ ๊ฒƒ
  • ์•ˆ๋…•ํ•˜์„ธ์š”.cgo2.o
  • ์•ˆ๋…•ํ•˜์„ธ์š”.c

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์ด ์„ค์น˜๋˜์ง€ ์•Š์Œ).

๊ฒฐ๊ณผ:

  • Go tools/link.exe์—์„œ ๋‚ด๋ถ€ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ .bss ๋ฐ์ดํ„ฐ๋ฅผ .data๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๊ถ๊ทน์ ์œผ๋กœ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
  • msvc์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ASM ์กฐ๊ฐ์„ ์กฐ์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ช‡ ๊ฐœ์˜ GCC #defs๊ฐ€ shim๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • cgo์—์„œ ์ƒ์„ฑํ•œ .c ํŒŒ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ์•ฝ๊ฐ„ ์กฐ์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์†Œ์ˆ˜๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ์ˆœ๊ฐ„์— shimํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • msvc ์ง€์›์„ ์œ„ํ•ด ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ๋งํฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ldflags ๋“ฑ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„:
์ด๋ฒˆ ์ฃผ๋ง์— ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํฌ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ๋นŒ๋“œ/๋งํฌ์˜ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 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]
  • ๋ณต์†Œ์ˆ˜๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ๋ณต์†Œ์ˆ˜๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • msvc ์ปดํŒŒ์ผ๋Ÿฌ๋กœ go ๋Ÿฐํƒ€์ž„์„ ๋นŒ๋“œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • gcc๋Š” ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๊ณ  gco๊ฐ€ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ •์˜ ๋ฐ ์œ ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด

์—ฐ๊ฒฐ๋œ ํŒจ์น˜๋กœ ์ธํ•ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@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 ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค. ๋‚ด๊ฐ€ ๊ทธ ๊ธธ์—์„œ ๋ญ”๊ฐ€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์ž.

๋˜ํ•œ ๋‹ค๋ฅธ ๋„๊ตฌ์— ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ํŒจ์น˜๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • cmd/cgo

    • -toolchain [gcc,msvc] (๊ธฐ๋ณธ๊ฐ’์€ gcc) cgo ์ถœ๋ ฅ ํŒŒ์ผ์„ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋„๊ตฌ ๋ชจ์Œ

  • cmd/๋งํฌ

    • -rlocbss(๊ธฐ๋ณธ๊ฐ’์€ false) .bss๋ฅผ .data๋กœ ์žฌ๋ฐฐ์น˜

    • -toolchain [gcc,msvc] (๊ธฐ๋ณธ๊ฐ’์€ gcc) ์™ธ๋ถ€ ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•  ๋„๊ตฌ ๋ชจ์Œ

๋˜ํ•œ ๋‹ค์Œ ๋นŒ๋“œ ์˜ต์…˜/cgo ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • MSCXX
  • MSCC
  • MSCFLAGS
  • MSCPPFLAGS
  • MSCXXFLAGS
  • MSLDFLAGS

๋ช‡ ๋ถ„ ๋™์•ˆ ์ƒ๊ฐํ•œ ํ›„์— ์ปดํŒŒ์ผ๋Ÿฌ ๋ช…๋ น์ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ๋ชจ๋‘ ํ•จ๊ป˜ ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ๊ทน๋ณตํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์• ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. go build ๋Š” ๋นŒ๋“œํ•  ๋Ÿฐํƒ€์ž„/cgo ํŒŒ์ผ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ๋„๊ตฌ ์ฒด์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” gcc ๋ฒ„์ „์„ ํ”„๋ก์‹œ ๋ช…๋ น์— ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ์ž์ฒด ๋‚ด๋ถ€์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„/cgo์— ์ถ”๊ฐ€ ํŒŒ์ผ์ด ์ถ”๊ฐ€๋˜๋ฉด ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ๊ณ  ๊นจ์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. cmd/cgo๋Š” ์‚ฌ์šฉํ•  ์ถœ๋ ฅ C ์ฝ”๋“œ์˜ ๋ฒ„์ „์„ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์™ธ๋ถ€ ๋„๊ตฌ ๋ชจ์Œ์˜ ์ข…๋ฅ˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ”„๋ก์‹œ ํ”„๋กœ๊ทธ๋žจ์€ gcc๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€(cmd/cgo์— ์˜ํ•ด ํ˜ธ์ถœ๋  ๋•Œ์™€ ๊ฐ™์ด) ๋˜๋Š” ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š” cl.exe๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•„๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ๋„๊ตฌ ์ฒด์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์šฐ๋ฆฌ๋Š” cmd/cgo๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ gcc์— ์ „๋‹ฌํ•˜๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  4. 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๊ฐ€ ์ค‘์ง€๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

์•„๋‹ˆ์š”. 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 ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด

  1. gcc.exe๋ฅผ ํฌํ•จํ•˜๋„๋ก ๋‚ด %PATH%๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. %GOROOT%\src ๋””๋ ‰ํ† ๋ฆฌ์—์„œ make.bat๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋จผ์ € Go ๋นŒ๋“œ
  3. ํ‘œ์ค€ 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๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰