Go: cmd / linkmsvcオブゞェクトファむルをサポヌト

䜜成日 2017幎07月11日  Â·  222コメント  Â·  ゜ヌス: golang/go

珟圚、goリンカヌがmsvcオブゞェクトファむルをリンクできないこずを理解しおいたす。たた、この問題の優先床が䜎い可胜性があるこずも認識しおいたす。 ただし、これをサポヌトするず、Windowsワヌクフロヌがいくらか簡玠化されるので䟿利です。 この問題は䞻に、これがどれだけの努力をするか、および/たたは䜕が必芁になるかを理解するこずです。

Builders FeatureRequest NeedsInvestigation OS-Windows

最も参考になるコメント

このスレッドの䞋郚から、MSVCの問題が敎理されおいるように芋えたす。 ただし、問題が発生した堎合は、MSVCチヌムに所属しおいたす。 githubたたは電子メヌル[email protected]で私にpingしおください。

党おのコメント222件

/ cc @alexbrainman

@xoviatあなたが抱えおいる問題は䜕ですか ここで再珟できる必芁がありたす。 したがっお、これを再珟するために埓う必芁のあるすべおの手順を提䟛しおください。

ありがずうございたした

アレックス

PS私は7月末たでコンピュヌタヌを持っおいたせん。 それではこれを芋おいきたす。

あなたが抱えおいる問題は䜕ですか

ただ詊しおいたせんが、msvcオブゞェクトファむルのc関数を.sysoずしおgoリンカヌでリンクするこずにより、具䜓的に呌び出したいず思いたす。 私が読んだすべおのこずは、これが䞍可胜であるこずを瀺しおいたすが、発生した特定の゚ラヌを再珟するための手順を䜜成したす。

具䜓的には、msvcオブゞェクトファむルのc関数を.sysoずしおgoリンカヌでリンクしお呌び出したす。

これらをDLLに組み蟌んで、DLL内から䜿甚しおみたしたか

発生した特定の゚ラヌを再珟する手順を䜜成したす。

しおください。 ありがずうございたした。

アレックス

これらをDLLに組み蟌んで、DLL内から䜿甚しおみたしたか

それが私の圓初の蚈画でした。 私はswigを䜿甚しおいるので、生成されたcコヌドを個別にコンパむルしおから、DLL゚クスポヌトずしお関数を曞き盎すのはあたり䟿利ではありたせん。 難しいこずではありたせんが、gccを䜿甚したワヌクフロヌがgo generate; go buildだけの堎合は面倒です。

了解したした。手順がありたす。 これらのファむルから始めたす。

hello.go

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」が必芁

c ++だけが問題でなければ、私はこれに぀いお心配する必芁はありたせん。 しかし、そうなので、痛みは続きたす...

ここに「ビルドツヌル2017」が必芁です。

ずった。 ありがずうございたした。

問題が倚すぎる堎合は、必芁に応じおオブゞェクトファむルを提䟛できたす。

はい、hello.objをどこかに投皿しおください。

これに぀いおもう少し考えおみおください。 実際には、gccを䜿甚しお、msvcコンパむラでコンパむルされたオブゞェクトファむルをリンクしおいたす。 挔習を詊しおみるこずができたすが、「gobuild」ステップをgccに眮き換えおhello.objをCプログラムにリンクしたすか おそらくそれは以前に行われたこずがありたす。 その方法を知っおいれば、Goでも同様のこずができるのではないかず思いたす。

アレックス

AFAIK lld https://github.com/llvm-mirror/lldは、msvcオブゞェクトファむルをサポヌトしたす。

オブゞェクトファむルはここにありたす https 

lldhttps //github.com/llvm-mirror/lldはmsvcオブゞェクトファむルをサポヌトしたす

Goは、Windowsではgccリンカヌlldではないを䜿甚したす。

オブゞェクトファむルはここにありたす https 

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リンカの出力をリンクしおいたすか

Goプログラムを䜜成するには、次の2぀のプログラムを䜿甚したす。

  • コンパむラは、.goファむル䞀床に1぀のパッケヌゞをGOPATH/ pkgディレクトリに保存されおいるオブゞェクトファむルに倉換したす。
  • GOPATH/ pkgの䞋のオブゞェクトファむルから最終的な.exeファむルを構築するリンカヌ。

時々パッケヌゞの1぀がCgoを䜿甚する堎合、Goリンカヌは倖郚リンカヌを呌び出しおCに実装されおいるすべおのビットを怜玢したす。Cコヌドからprintfを呌び出すず想像しおください。 C printfでコンパむルされたコヌドはGo実行可胜ファむルの䞀郚である必芁がありたすが、Goリンカヌはそれをどこで取埗するかを知りたせん。 したがっお、Goリンカヌは倖郚リンカヌを呌び出しおそのコヌドを含めたす。

Current Goは、gccコンパむラ/リンカヌを䜿甚しおCコヌドをコンパむルおよびリンクしたすmingw gccを䜿甚したす。 別のコンパむラMicrosoft補でCコヌドをコンパむルする堎合は、察応するリンカMicrosoft補を䜿甚しお、コンパむラが䜜成したすべおの倖郚Cコヌドを芋぀ける必芁がありたす。

だから、私はgccリンカヌを䜿甚するこずを提案するこずに぀いお間違っおいたず思いたす。 䞀般的なシナリオでは、Microsoftコンパむラずリンカの䞡方を䜿甚する必芁がありたす。 Microsoftリンカヌが入力ずしお䜕を必芁ずするかを理解し、それに䞀臎させる必芁がありたす。

Cコヌドに倖郚コヌドがない堎合は、MCリンカヌがなくおも問題が解決する可胜性がありたす。 本圓に単玔なCプログラム2぀の敎数などを远加するプログラムなどを詊しおみおください。 これは、䞊蚘で説明したように機胜する可胜性がありたす。

アレックス

おそらくstdioは立ち入り犁止ですか

そのコヌドを芋぀けるには、Microsoftリンカヌを呌び出す必芁があるず思いたす。

アレックス

よくわかりたせんが

objconv -felf hello.obj hello.syso

たぶん、あなたぱルフの代わりにcoffやomfをやっおみるべきですか

たぶん、あなたぱルフの代わりにcoffやomfをやっおみるべきですか

@xoviatはい、.objファむルをelfに倉換しないでください。Windowsバヌゞョンのgccは、他のWindowsコンパむラず同じようにpe / coffファむルを生成したす。

アレックス

Goリンカは、倖郚リンカを呌び出しお、Cで実装されおいるすべおのビットを怜玢したす。

䜿甚される特定のコマンドは䜕ですか mingwコマンドを知っおいる堎合は、ファむル比范パスをたどっお、mingwが出力しおいるものずmsvcを䞀臎させようずするこずができたす。

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] WSAGetOverlappedResult
  • [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はランタむムパッケヌゞの䞀郚です。 「gobuild」コマンドが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ファむルで定矩されおいたす。 そのファむルはGCCによっおコンパむルされたすすべおのruntime / cgo / 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

リク゚ストどおりにフォルダが構成されたらお知らせください。

ちなみに、これに取り組んでくれおありがずう。 あなたたちは本圓に魔法の蚀語を䜜成したした。

リク゚ストどおりにフォルダが構成されたらお知らせください。

あなたがここで説明したように、私はなんずかlibgo.libを構築するこずができたしたhttps://github.com/golang/go/issues/20982#issuecomment -327365063
次に䜕をすればいいですか

アレックス

では、次のファむルが必芁です。

  • libgo.lib
  • グヌ
  • hello.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 fileを蚘述したす。 そしお、それから実行可胜プログラムを構築しおみおください-プログラムは最初から関数を実行する必芁がありたす。

たぶん、最初にGoツヌルを䜿甚しおそしお必芁に応じおgccを䜿甚しおビルドしおから、MSVCを䜿甚しお同じこずを詊しおみおください。

アレックス

アレックス、助けおくれおありがずう。 私はそれに取り組みたす。

参考たでに、これら2぀の蚘事をここに添付したす。 それ以倖の堎合、これ以䞊の曎新はありたせん。

私は実際に、msvcラむブラリのみを䜿甚するかなり耇雑なgoプログラムを動䜜させたした。 バニラmsvcリンカヌずllvm-lldの䞡方が.bssセクションを正しく凊理しなかったこずが刀明したした。

リンカにパッチを適甚するず、プログラムを実行できるようになりたす。

残念ながら、 go buildは、 _cgo_.o / _all.o生成するず壊れたす。 cgoでこれら2぀のファむルを生成する背埌にある理論的根拠に光を圓おるこずは可胜ですか

go tool cgoを実行しお、cgoを盎接実行できたす。 ゜ヌスはここにありたす https 

たた、これを実行できるずしたら、それは玠晎らしいこずです。 私はこれに時間を割いおいないので、進歩はありたせんでした。 申し蚳ありたせん。

䞀連の手瞫いで正しく実行できるプログラムをすでに入手しおいたす。ここでやろうずしおいるのは、プロセスを統合しお、痛みを軜枛できるかどうかを確認するこずです。 :-)

手瞫いのプロセスを文曞化できれば、私がお手䌝いできるかもしれたせん。

芋ただけで、 _cgo_.oは次のように生成されおいるようです簡略化

gcc [*.c] [*.cxx] -o _cgo_.o

ここから https 

たた、ドキュメントに぀いおは、こちらを参照しおください。
https://github.com/golang/go/blob/840f2c167f1d5196559d8a1e77c370960e66d34e/src/cmd/cgo/doc.go#L607

理想的には、オブゞェクトファむルを前凊理しおlink.exeず互換性を持たせ、摩擊を最小限に抑えるgoプログラムを䜜成したすが、それは䞀皮の目暙です。

ポむンタをありがずう-私はすぐにプロセスを曞き留める぀もりです。

残念ながら、 .bssセクションではなく.dataセクションで初期化されおいないデヌタを出力するようにgccを倉曎しない限り、 link.exeを介しおリンクを実行できるずは思いたせんが、可胜です。 llvm-lldを確実に修正しお、 .bssセクションを認識したすこれは私が行ったこずです。

_cgo_.oず_all.o別々に取り組む必芁がありたす。 私はそれらに぀いおいく぀か質問がありたす

1 _cgo_.oは、goランタむムが含たれおいないため、最終的な実行可胜ファむルではないようです。 コンパむラが構造䜓の定矩を理解するためにDWARFシンボルを調べおいるように芋えたす。 問題は、倖郚の倚数のラむブラリ、特にmsvcによっお生成されたラむブラリずリンクする堎合、実行可胜ファむルを生成するのが難しいこずです。

このステップを回避するこずは可胜ですか

2珟圚はGNU ldを䜿甚しお、GCCで-Wl,-rを枡すこずにより、すべおのオブゞェクトファむルを_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を介しおリンクを実行できるずは思いたせんが、llvm-lldを修正しお.bssセクションを認識するこずは間違いありたせん。 これは私がやったこずです。

MSFTが曎新されないず仮定しおlink.exe 可胜性のあるを、持぀オブゞェクトファむルをコンパむルするずよいでしょうcl.exeではなくgcc 。

_cgo_.oは、goランタむムが含たれおいないため、最終的な実行可胜ファむルではないようです。

そうです、基本的に2セットのオブゞェクトファむル私は思うが最終的に䞀緒にリンクされたす。 go.oファむルIIRCには、すべおのgoコヌドずランタむムが含たれ、他のオブゞェクトにはCコヌドが含たれおいたす。 2セットのオブゞェクト間をゞャンプするためのアセンブリルヌチンがありたす。

たた、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バヌフ。

確かに、 CC環境倉数を適切に蚭定するこずにより、MSVCCのコンパむラも䜿甚する必芁がありたす。 GCCオブゞェクトずMSVCオブゞェクトを1぀のリンクに結合するこずはうたくいかないず思いたす。

しかし、その埌、ランタむムCラむブラリがプリコンパむルされるずいう問題が発生したす。 そしお、それらを再コンパむルしようずするず、 clがUNIXアセンブリをコンパむルできないずいう問題が発生したす。 そしお、ランタむムラむブラリの䞀郚を移怍し、それらをリンクしようずしたす。これは私が行っお倱敗したこずです。

途䞭のどこかで、 clはコヌドの重芁な郚分を誀っおコンパむルしたす。 これを修正するための私のアむデアは、MSVCコヌドをフラットC APIを䜿甚しおDLLに分解し、動䜜が停止するたでランタむムラむブラリを段階的にコンパむルするこずです。

問題を解決するための@haohuiの考えは異なっおいたした。 圌は問題の根本を修正するのではなく、リンカヌにパッチを圓おるこずで問題を回避したした。 明らかに圌は私よりも倚くの成功を収めたしたが、それはおそらく圌のアプロヌチが私よりもうたくいく可胜性が高いためです。

この時点IMHOでお勧めするのは、ランタむムラむブラリが機胜しなくなるたで、たたはgccコヌドがなくなるたで、 clを䜿甚しおランタむムラむブラリを段階的にコンパむルするこずです。 そうすれば、問題がどこにあるかを正確に知るこずができたす。

たた、リンカヌパッチを䜿甚するず、DLLは必芁ありたせん。

llvm-lldのパッチは、 https //bugs.llvm.org/show_bug.cgi 。

䟋を瀺すために少し時間を費やしたす。

+1 @haohuiこれを進めおくれおありがずう

@haohuiパッチはどのバヌゞョンのllvmに適甚されたすか パッチの䜿甚方法ずMSVCファむルぞのリンク方法に関する指瀺はありたすか

_cgo_.oファむルず_all.oファむルに関しおは、同じ問題が発生したため、この問題の修正が他の問題の修正になる可胜性がありたす https 

これに関するすべおの䜜業に感謝したす。 順調に進んでいるようです。 新機胜はGo1.11たで凍結されるため、マむルストヌンが倉曎されたす。

それで私は昚倜この䞭に飛び蟌んだ。 msvcclを介しおすべおをビルドし、 たす。 しかし、問題は軍団です。

したがっお、 msvcclがC99を完党にサポヌトしおいないなどの単玔な問題を超えお珟圚、タむプ_Complexを凊理できたせん。 gointernalsによっおビルドされたPEラむブラリずmsvcによっおビルドされたPEラむブラリを組み合わせるず、より䜓系的な問題が発生したす。 具䜓的には、 msvclinkは.bssセグメントを吹き飛ばしたすこのデヌタを.dataにスロヌする可胜性があるず思いたす。これは、goアセンブラヌSBpseudo regが、.bssが移動された堎合に誀ったアドレス指定をもたらすように芋えるため、問題です。 。

私の最初の考えは、アセンブラに.bssず.noptrbssに入るものをそれぞれ.dataず.noptrdataに配眮させるこずでした。 これが可胜かどうかさえわかりたせん。 私がそれをいじるのは成功せず、アドレス指定は完党に倱敗したす。

今のずころlink.exeは䜿えないず思いたす。 lld-link.exeから始めるべきだず思いたす

その背埌にある考えが、.bssデヌタを移動しないようにlld-linkにパッチを適甚できるずいうこずであれば、私はその魅力を理解しおいたす。 珟実的には、目暙が実際のmsvcツヌルチェヌンをサポヌトするこずである堎合は、内郚コンパむルに進み、デヌタを.bss /.noptrbssに配眮する必芁がありたす。

lld-link.exeをgoで再配垃するこずはできたせんか これは、LTCGが有効になっおいない限り、MSVCオブゞェクトファむルをサポヌトするための最もリスクの䜎いパスのようです。 理想的ではないこずは理解しおいたすが、リ゜ヌスの制玄に盎面しおいたす。

それはたた、最良の戊略である挞進的な進歩を可胜にしたす。

さお、いく぀かの良いフォロヌアップニュヌス、私は昌食時にこれに取り組むのに1時間を費やすこずができたした。

珟時点では、問題の前半の䟋が機胜しおいたす。

- 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に出力するこずは、最終的にはかなり簡単でした。
  • いく぀かのASMピヌスをmsvc甚に調敎する必芁がありたした
  • いく぀かのGCCdefがシムされたした
  • cgoで生成された.cファむルの䞀郚にいく぀かの小さな調敎を加える必芁がありたした
  • 耇玠数は、サポヌトされおいない時点でシムする必芁がありたす
  • msvcサポヌト甚にビルドたたはリンクするには、远加のフラグを盎接远加する必芁がある可胜性がありたす。ldflagsなどでは䞍十分です。

次のステップ
今週末に時間があれば、倉曎をフォヌクに入れる䜜業をしたすが、ビルド/リンクのフラグの背埌にある機胜です。 その埌、PRを行っおレビュヌを行い、皮類を怜蚎したす。 .bssデヌタを移動しおも、どこかに䜕らかの圱響がないこずを100確信しおいるわけではありたせん。

私が考えるこずができる唯䞀の欠点は、バむナリのサむズが倧きくなるこずですが、問題はないはずです。

わかった

申し蚳ありたせんが、これをたずめるのにさらに数日かかりたした。 したがっお、パッチの最初のドラフトはここにありたす https  https://github.com/cchamplin/go/tree/msvc_toolchain_support

これはただ倧雑把ですが、msvcを䜿甚しおコヌドを正垞にビルドできたす。

人々が今これをテストし始めおバグを私に報告しお、私がこれを䞊流のより良い堎所に眮くこずができれば玠晎らしいず思いたす。 たた、誰かがテストを曞くこずをチップしたいなら、それは玠晎らしいでしょう

䜿甚法

go build -compiler msvc [path]
  • 耇玠数は、私たちがそれらを機胜させるこずができるかどうかを理解するたで、珟圚サポヌトされおいたせん。
  • msvcコンパむラを䜿甚しおgoランタむムをビルドしようずするずどうなるかわかりたせん。
  • gccはただ必芁であり、コンパむル時に定矩ず型デヌタを取埗するためにgcoによっお䜿甚されたすが、ビルドには䜿甚されたせん。 これを回避できるかどうかはわかりたせんが、msvcには同じドワヌフずコヌドの#defineダンプを実行できるものは䜕もありたせん...誰かがこれに぀いおアむデアを持っおいるなら、それは玠晎らしいこずです

リンクされたパッチは、ブヌトストラップの問題を匕き起こしたす。

@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にgccだけでなくMicrosoftビルドツヌルもサポヌトさせたいですか 察応するMicrosoftツヌルをビルダヌにむンストヌルする必芁がありたすCLの受け入れを開始する前にむンストヌルする必芁がありたす。 おそらく、新しい環境倉数を導入する必芁がありたす。 新しいドキュメント。

答えが「はい」の堎合、 @ cchamplinはhttps://golang.org/doc/contribute.htmlに埓っお、コヌドの倉曎を送信する必芁がありたす。 倉曎は非垞に倧きいため、個別に確認しお送信できるように、小さなCLに分割する必芁がありたす。 倉曎を送信するには、倉曎ごずにall.batPASSが必芁です。 最初のCLの送信を開始する前に、すべおのCLを確認できれば䟿利です。

ありがずうございたした。

アレックス

GoにgccだけでなくMicrosoftビルドツヌルもサポヌトさせたいですか

このパッチは、私がすでにパッチを凊理しおいる17014も容易にするこずに泚意しおください。

答えが「はい」の堎合、 @ cchamplinはhttps://golang.org/doc/contribute.htmlに埓っお、コヌドの倉曎を送信する必芁がありたす。 倉曎は非垞に倧きいため、個別に確認しお送信できるように、小さなCLに分割する必芁がありたす。

はい、そしおそれを分割するこずは倧したこずではないはずです。 すべおのコヌドをクリヌンアップしたり、ドキュメントを䜜成したり、テストを䜜成したりする前に、これが問題になる可胜性があるかどうかを知る必芁がありたす。

GoにgccだけでなくMicrosoftビルドツヌルもサポヌトさせたいですか

私の考えでは、答えはむ゚スです。 コンパむラ自䜓はVSCommunityで無料であり、完党なWindowsサポヌトがないこずは本圓にむラむラしたす。 Windowsツヌルチェヌンはサポヌトされおいないため、 github.com/Microsoft/hcsshimをコンパむルするためにLinuxボックスを立おる必芁はありたせんたずえば。

Windowsツヌルチェヌンをサポヌトしない理由は䜕でしょうか

原則ずしお、MSVCオブゞェクトファむルをサポヌトするこずは問題ないず思いたす。 ビルダヌが必芁になりたす。

私の䞻な関心事は、WindowsたたはMSVCのリリヌス間でフォヌマットがどの皋床倉わる可胜性があるかです。 他のほずんどのプラットフォヌムで䜿甚されおいるELF圢匏は非垞に安定しおいたす。 新しいプロセッサのサポヌトを远加する以倖の方法でELFサポヌトを埮調敎する必芁があるこずはめったにありたせん。 MSVCファむル圢匏も同様に安定しおいたすか

MSVCツヌルチェヌンに関連付けられおいる圢匏はかなり安定しおいたす。 最倧の問題は、ツヌル自䜓をサポヌトするこずです。 Microsoftは、Visual Studioのリリヌス間で物事ファむルずレゞストリ゚ントリを移動する傟向がありたす。 これのほずんどは少なくずも私が曞いたパッチでは構成可胜ですが、Visual Studioの新しいメゞャヌバヌゞョンがリリヌスされたずきに、Goを倉曎しないずビルドツヌルチェヌンずしお互換性がない可胜性がありたす。 ただし、サポヌトされおいる以前のバヌゞョンのVisualStudioはすべお匕き続き機胜したす。

私の知る限り、C ABIC ++ではなくだけにさらされた堎合、COFF圢匏は劥圓な安定性を備えおいたす。 たた、広範囲にわたっお文曞化されおおり、LLVMはリファレンス実装を提䟛したす。

@cchamplin MSVCずリンクする前に、ナヌザヌにvcvarsall.batを呌び出すように芁求するこずをお勧めしたす。 これにより、メンテナンスがほがれロに倧幅に削枛されたす。

ビルダヌが必芁になりたす。

@ianlancetaylor MSVCオブゞェクトが意図したずおりに機胜するこずが蚌明されたら、msys / cygwinビルダヌずMSVCビルダヌの䞡方が必芁になるず思いたすか、それずもMSVCビルダヌのみが必芁になるず思いたすか

cygwinツヌルの䜿甚を奜む人もいるず思いたすが、それらはすでに機胜しおおり、匕き続き機胜させたいので、2぀のビルダヌが必芁だず思いたす。

このスレッドの䞋郚から、MSVCの問題が敎理されおいるように芋えたす。 ただし、問題が発生した堎合は、MSVCチヌムに所属しおいたす。 githubたたは電子メヌル[email protected]で私にpingしおください。

ビルダヌが必芁になりたす。

はい。 そしお、MSビルドツヌルをむンストヌルするように既存のビルダヌを倉曎するこずから始める必芁がありたす。 したがっお、この問題のCLを受け入れるずきに、それらを䜿甚できたす。

gccツヌルずmicrosoftツヌルの䞡方をすべおのビルダヌにむンストヌルできたす。 gccツヌルずMicrosoftツヌルの䞡方を䞀床にテストするall.batを実行できたすか そうでない堎合は、さたざたなツヌル甚にさたざたなビルダヌを構成する必芁がありたす。 䜿甚する倖郚コンパむラずリンカを制埡するパラメヌタは䜕ですか

私の䞻な関心事は、WindowsたたはMSVCのリリヌス間でフォヌマットがどの皋床倉わる可胜性があるかです。

Windowsにコンパむラがむンストヌルされおいたせん。 自分でむンストヌルする必芁がありたす。 gccず同じように。 奜きなバヌゞョンをむンストヌルしたす。 異なるビルダヌで異なるgccバヌゞョンを実行するこずもできたす。

MSVCファむル圢匏も同様に安定しおいたすか

私はそれに぀いお䜕も知りたせん。 提䟛されおいるツヌルを䜿甚しおいるだけだず思いたす。

アレックス

私の䞻な関心事は、WindowsたたはMSVCのリリヌス間でフォヌマットがどの皋床倉わる可胜性があるかです。 他のほずんどのプラットフォヌムで䜿甚されおいるELF圢匏は非垞に安定しおいたす。 新しいプロセッサのサポヌトを远加する以倖の方法でELFサポヌトを埮調敎する必芁があるこずはめったにありたせん。 MSVCファむル圢匏も同様に安定しおいたすか

はい、COFFは非垞に安定しおいたす。

@bradfitzず@ianlancetaylorこの問題の倉曎をテストするためにWindowsビルダヌを利甚できるようにするために䜕が必芁ですか https://github.com/golang/go/issues/20982#issuecomment-370719472で私の質問を参照しお

ありがずうございたした

アレックス

今すぐmsvcオブゞェクトをサポヌトしたすか

倉曎https://golang.org/cl/110555はこの問題に蚀及しおいたす debug/pe: parse the import directory correctly

@alexbrainman @bradfitz @ianlancetaylor 

パッチをクリヌンアップしおより消化しやすい郚分に分割するために必芁な䜜業のほずんどを実行したした。 プロゞェクトぞの実際の提出の準備がほが敎っおいるず思いたす。 コヌドを送信する前にビルダヌの状況に぀いおの情報を埅぀必芁があるのか​​、それずもできるだけ早く実行するのかを知る必芁があるず思いたすか

CLはい぀でも送信できたすが、誰かがビルダヌをセットアップする必芁がありたす。 そうでなければ、それらをテストする方法がありたせん。

@ johnsonj 、MSVCコンパむラツヌルをWindowsむメヌゞに远加できたすか

理想的には、新しいホストタむプを远加せず、既存のWindowsホストタむプの1〜3にCygwinに加えおMSVCツヌルを持たせたいず思いたす。 そしお、それらの倉曎されたホストタむプの䞊にさらにビルダヌ構成を远加できたす。

/ cc @andybons @bcmills as FYIWindowsの凊理がどのように行われるかに぀いお...私たちはJeffに助けを求めたす:)

@ johnsonj 、MSVCコンパむラツヌルをWindowsむメヌゞに远加できたすか

@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を1回実行するだけで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 このための戊略をテストする限り、私は䜕をすべきか正確には

このためのテスト戊略に関する限り、私は䜕をすべきか正確にはわかりたせん。 りィンドりで䞡方のツヌルチェヌンに察しおdisttestを実行するパスを取り、すべおのテストを2回実行できたすか、それずもcgoテストを2回gccに察しお1回、msvcに察しお1回だけテストする必芁がありたすか

@cchamplinあなたの質問に察する答えはありたせん。 むアンは答えを知っおいるず思いたす。

アレックス

cgoだけでなく、すべおのテストを2回実行するコストはいくらですか

@ mxplusb 、Windowsの新しいビルド構成を実行するだけで、既存の3ず䞊行しお実行されたす。新しいビルダヌ構成で問題ありたせん。 定期的に远加しおいたす。

それを倉える方法を教えおください異なる/新しい環境倉数を蚭定するず、䜕かがそれを拟うず思いたすか

これを機胜させるには、おそらくいく぀かのこずが必芁です。

適切なvsvars.batが実行/呌び出された埌、distテストが実行するgoテストが内郚で実行されるシェル/環境の内郚で実行する必芁がありたす。

たたは、適切なvsvarをdistで実行し、必芁な環境倉数を抜出しおから、それらを蚭定/受け枡ししおテストを行うこずもできたす。

たた、-compiler msvc setを䜿甚しおテストを実行するこずをdistたたはmake.batに通知するために、環境倉数が必芁になる堎合もありたす。

適切なvsvars.batが実行/呌び出された埌、distテストが実行するgoテストが内郚で実行されるシェル/環境の内郚で実行する必芁がありたす。

たたは、適切なvsvarをdistで実行し、必芁な環境倉数を抜出しおから、それらを蚭定/受け枡ししおテストを行うこずもできたす。

dist.exeたたはgo.exeからバッチファむルを実行しない方がいいず思いたす。 バッチファむルを扱うのは面倒です。

たた、-compiler msvc setを䜿甚しおテストを実行するこずをdistたたはmake.batに通知するために、環境倉数が必芁になる堎合もありたす。

私はむアンがここでの最善のアプロヌチが䜕であるかを知っおくれるこずを望んでいたした。 私が知っおいるこずから、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環境倉数を蚭定するこずによっお蚭定されたす。

説明しおくれおありがずうむアン。

@cchamplin既存のモデルに合うように倉曎を調敎できるこずを願っおいたす。 ご䞍明な点がございたしたら、お気軜にお問い合わせください。 ありがずうございたした。

all.batを実行する前に、CC_FOR_TARGET環境倉数をmsvcに蚭定するように調敎するビルダヌがあるず思いたす。

https://build.golang.orgに3぀のamd64Windowsビルダヌがあり

アレックス

@ianlancetaylor @ alexbrainman - compilerフラグに぀いお理解したした。 CC="msvc" たたは実際にはCC="cl.exe" を蚭定するだけで機胜させる簡単な方法はないず思いたす。 CCは、MSVCビルドが機胜するためにGCCの堎所を指す必芁がありたす。 msvcコンパむラツヌルセットには、CGOが必芁なむントロスペクション定矩ルックアップ、型解決を実行できるようにするためのツヌルがないため、MSVCビルドではGCCが匕き続き必芁であり、GCCは実際のコンパむル/リンクフェヌズでは䜿甚されたせん。

ビルドするために新しいフラグを远加するこずはすべお受け入れられたすかツヌルチェヌンなど 私はすでにツヌルチェヌンフラグをcgoに远加する必芁があったず思いたす。

たた、all.batの前にCC_FOR_TARGET蚭定するず、ブヌトストラップで䜿甚されるコンパむラに圱響を䞎えるため、悪圱響が生じる可胜性がありたす。 ブヌトストラッププロセス䞭にMSVCを䜿甚できるずは思いたせん100ではありたせん。実際に詊したこずはありたせんが、機胜するかどうかは非垞に疑わしいです。

なるほど、MSVCの堎合、GCCずMSVCの䞡方が必芁ですか GCCはcgoツヌルでのみ䜿甚されたすか これは、GCCずMSVCがたったく同じABIを実装するこずに完党に䟝存するこずを意味するため、やや䞍幞に思えたすが、それはかなり可胜性が高いず思いたす。

GCCに蚭定できる別の環境倉数CC_FOR_CGO远加できるず思いたす。

make.batで䜿甚されるCC_FOR_TARGETは、runtime / cgoのビルドに䜿甚されたす。 䜿甚しおいるCコンパむラでruntime / cgoがビルドされおいない堎合、cgoがどのように機胜するかは私にはわかりたせん。

おそらく、make.batが呌び出されたずきにCC_FOR_TARGETをcl 、 CGO_ENABLEDを0蚭定しお動䜜させるこずから始める必芁がありたす。

ありがずう@ianlancetaylor 

なるほど、MSVCの堎合、GCCずMSVCの䞡方が必芁ですか GCCはcgoツヌルでのみ䜿甚されたすか これは、GCCずMSVCがたったく同じABIを実装するこずに完党に䟝存するこずを意味するため、やや䞍幞に思えたすが、それはかなり可胜性が高いず思いたす。

私はそれが䞍幞であるこずに同意したす、そしおいく぀かの代替案を知っおうれしいです、私はただそれを芋぀けおいたせん。 この方法でビルドするリスクは確かにありたすたずえば、ビルドされるcgoコヌドは、ビルド元ず芋なされるコンパむラに応じお、異なる型の定矩たたは定矩を持ちたす。 そのため、いく぀かの調敎を行わないず、ビルドが垞に成功したり正しく機胜したりするわけではありたせん私の実装ではこれを凊理するメカニズムがありたすが、少し手動のプロセスです。 残念ながら、これは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は、runtime / cgoのビルドに䜿甚されたす。 䜿甚しおいるCコンパむラでruntime / cgoがビルドされおいない堎合、cgoがどのように機胜するかは私にはわかりたせん。

珟圚の実装では、goツヌルチェヌン党䜓がgccによっお構築されおいる堎合でも、cgoはmsvcバむナリに察しお問題なく機胜したす。 たずえば、MSVCコヌドがgo / srcに远加されたす。 all.batは、gccを䜿甚しおgo環境を構築するために実行されたす。 その埌、go / bin / go.exeを䜿甚しおmsvcツヌルチェヌンでビルドできたすフラグが提䟛されおいるず想定。 私はあなたがここで蚀っおいるこずを誀解しおいるかもしれたせん。

msvcを䜿甚しおビルドするように指瀺するこずは、コンパむラをclに切り替えるよりも耇雑であるため、これに関する耇雑さ。 MSVCツヌルチェヌンはgccツヌルチェヌンずは倧きく異なりたす。 MSVCでは、vcvars.bat内で実行するこずで環境をセットアップする必芁がありたすたたは、vcvars.batを実行し、セットアップした環境倉数から必芁なすべおの情報を抜出しおビルドで䜿甚するなど、v8が行うこずを実行したす。凊理する。 MSVC環境に入った埌の䞻な違いは、ツヌル自䜓がcl.exeを䜿甚しおCおよびC ++ファむルをコンパむルし、ml.exeおよびml64.exeを䜿甚しおファむルをアセンブルし、最埌にlink.exemsを䜿甚しおすべおをリンクしたす。 ぀たり、 CC=cl.exeを蚭定しお、適切なフラグを枡すだけではありたせん。 それは理にかなっおいたすか/物事を明確にするのに圹立ちたすか

さらに明確にするために

make.batで䜿甚されるCC_FOR_TARGETは、runtime / cgoのビルドに䜿甚されたす。 䜿甚しおいるCコンパむラでruntime / cgoがビルドされおいない堎合、cgoがどのように機胜するかは私にはわかりたせん。

go buildは、ビルドプロセス䞭にruntime / 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 / link

    • -rlocbssデフォルトはfalse.bssを.dataに再配眮したす

    • -toolchain [gcc、msvc]デフォルトはgcc倖郚リンクに䜿甚されるツヌルチェヌン

たた、次のビルドオプション/ cgo環境倉数を䜜成したす。

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

数分間考えた埌、コンパむラコマンドをプロキシするだけでは克服するのが難しいかもしれないいく぀かのハヌドルがありたす。

  1. go buildは、ビルドするランタむム/ cgoファむルを決定するために倖郚ツヌルチェヌンが䜕であるかを知る必芁がありたす。そうしないず、互換性のないgccバヌゞョンをプロキシコマンドに枡すだけになりたす。 プロキシ自䜓の内郚でこれをハックするこずはできるかもしれたせんが、runtime / 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 

別の方法は、指定されたCCでgo build停の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が蚭定されおいないcgoアプリケヌションを構築するだけで、cl.exeはパス䞊にありたすが、gccはそうではありたせん。

@blizzardplus䞊蚘ず同様に、レビュヌでは珟圚倚くのこずが流動的であるため、詊しおみるのは少し早いかもしれたせんただし、あなた次第です。 関連するすべおの倉曎は、gopherbotによっおこの問題に投皿されたした。ここで、それらを芋぀けるこずができたす。

@cchamplinは、 gccたたはclangいずれかを䜿甚したクロスコンパむルのサポヌトがありたすか もしそうなら、圌らはテストされおいたすか

@cchamplin 9/11以降、CLでの掻動は芋られたせん。これに぀いおは前進が芋られたすか、それずも远加のリ゜ヌスが必芁ですか

これは、その埌に行われおいない堎合は- C-アヌカむブctorsセクションが.CRT $ XCUhttps://msdn.microsoft.com/en-us/library/bb918180.aspxに倉曎されなければならないための䜜業には、このため@cchamplin golangランタむムは初期化されたせん。 たた、これに蚭定するず、gccでも正垞に機胜するこずがわかりたす-gcc stilはこれらの関数を取埗し、テキストセクションに移動し、mainを倉曎しお実際のmainの前に呌び出したす。 Visual Studioは.aアヌカむブファむルを理解できたす。プリコンパむル/アセンブルされたファむルのむンタヌフェむスはCであるため、これをアヌカむブに含めるだけで問題は発生したせん。 2぀の.textセクションに関する譊告がありたすが、単玔なケヌスは正垞に機胜しおいるようです問題がないこずを確認するためにさらにテストが必芁です。

たた、これがc-sharedで機胜するためには、゚クスポヌトされる関数を__declspecdllexportで装食する必芁がありたすが、// exportのこの展開がどこで発生するかがわかりたせん。

@ blizzardplusclang -MSVCをサポヌトするためのフォロヌアップパッチがありたす。 この堎合、クロスコンパむルずはどういう意味かわかりたせんか Windows以倖のシステムではMSVCツヌルチェヌンを䜿甚できなくなりたす。 他のクロスコンパむル機胜は倉曎しないでください。

@kshelton残念ながら、私が発衚しおいる䜜品や䌚議には他のプロゞェクトがあるので、これは私にずっお非垞に忙しい時期です。 12月たで、パッチに必芁なリファクタリングを取り戻すこずができない堎合がありたす。

@ksheltonありがずう。 パッチを再確認しおいたせん。c-archiveがMSVCで機胜しない、たたは具䜓的に無効にするこずを前提に開発したず思いたすか プラグむン/共有をWindowsで動䜜させようずしたずきに、゚クスポヌトを適切に装食しようず詊みたした。 私が信じおいる他の問題がありたすが、私は2぀の問題を混同しおいる可胜性がありたす。 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を䜿甚しお自分自身を構築しようずしたこずもありたせん。 これが機胜するかどうか/サポヌトする必芁があるかどうかはわかりたせん。

-NS

少なくずも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に指瀺する環境倉数を䜿甚できたす。その堎合、2぀の異なるビルダヌに異なるバヌゞョンのテストを実行させるこずができたす。 あなたはそれに぀いおすべお考えたしたか

はい、この正確なメカニズムは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 = somevsvars.batパスを蚭定したす。 その埌、all.batを䜿甚したビルドで、gccテストずmsvccgoテストの䞡方を実行する必芁がありたす。

やっおみたした。

䜿った

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であるはずです。 しかし、あなたの質問に答えるために; gerritから

PS1、1324行目
cgoには、型分析に䜿甚できるgccがただ必芁です。 CCがMSVCコンパむラに蚭定されおいる堎合、cgoにはCC_FOR_CGOによっお提䟛されるGCCを呌び出す手段が必芁です。 残念ながら、MSVCツヌルチェヌンには、gccから収集されおいるのず同じタむプの情報を提䟛するメカニズムがありたせん。 理論的には、cgoで䜿甚される型情報を収集するために、go固有のツヌルを䜜成できたすが、範囲倖であり、かなりの劎力がかかる可胜性がありたすC / C ++コヌドの静的型分析を実行するために個人的に䜕かを曞いたこずはありたせん。

たた、GCCずMSVCの実行の間にキャッシュがクリアされた状態で䜕かが壊れたようですが、䞀郚のテストがただキャッシュされおいるかのように動䜜しおいる理由がわかりたせん。

私は問題を修正し、倉曎セットにいく぀かの曎新をプッシュしたず思いたす。

このセットアップhttps://github.com/golang/go/issues/20982#issuecomment-447618566 on

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に蚭定されおいるず仮定できたすか

しかし、あなたの質問に答えるために; gerritから

説明ありがずうございたす。

アレックス

@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)

stdioむンクルヌドではC4710を抑制する必芁がありたす。 あなたのバヌゞョンの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のようになりたす。 GCCがMSVCビルドのパス䞊にないずいうナヌスケヌスをサポヌトしたくない堎合は、私に知らせおください。環境倉数をたずめお取り陀くこずができたす。

このバヌゞョンをもう䞀床詊したした

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 

最新のSDKおよびビルドツヌルに曎新するこずは可胜ですか SDK10.0.17763.0を䜿甚しおいたす。 およびビルドツヌル/ devenvのバヌゞョン15.9.28307.222

MSVCを䜿甚しおWindowsDLLを構築しようずしおいたすが、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リンクに感謝したす、/ Werrorに関する私の特定の問題はそこで解決されおいるようです。
これがい぀ベヌタ版/毎晩/安定版になるか知っおいたすか

最新のSDKおよびビルドツヌルに曎新するこずは可胜ですか SDK10.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>

たた、すべおのテストを2回実行しおいるこずに気づきたした。

...
##### 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これらのテスト、特にこの堎合はスペクタヌの譊告では、譊告を抑制できる可胜性がありたす。

2回実行されるテストの堎合、ビルダヌに察しおそのように実行されたず思いたす。gccコンパむルでテストを1回実行し、MSVC有効な堎合でテストを再床実行しお、䞡方のツヌルチェヌンでのコンパむルが機胜するこずを確認したす。 ここで䜕が必芁かわからないので、MSVCを有効にしおall.batを呌び出すず、MSVCでのみテストを実行するように倉曎できたす。お知らせください。 その堎合、MSVCでビルドするビルダヌずは察照的に、MSVCだけに远加のビルダヌを远加する必芁があるず思いたすか

Windowsでは、䞡方のシナリオをテストするために、MinGW-W64ツヌルチェヌンを䜿甚しお1぀のビルダヌを実行し、MSVCツヌルチェヌンを䜿甚しお別のビルダヌを実行する必芁があるこずに同意したした。

ビルダヌではそのように行われたず思いたす。gccコンパむルでテストを1回実行し、次にMSVC有効な堎合でテストを再床実行しお、䞡方のツヌルチェヌンでのコンパむルが機胜するこずを確認したす。

䞡方のツヌルチェヌンが存圚する堎合に既存のワヌクロヌドを壊さないこずが保蚌されるように、これが掚奚される動䜜であるこずに同意したす。

譊告は、これらのテスト、特にこの堎合はスペクタヌ譊告で抑制される可胜性がありたす。

Goコマンドは譊告を衚瀺しないため、譊告は衚瀺されたせん。

たた、 go envコマンドがCC_FOR_CGO倉数を衚瀺しないこずに気づきたした。 CC_FOR_CGOがgoビルドの動䜜に圱響を䞎える堎合は、CC_FOR_CGOを他の人ず䞀緒に衚瀺する必芁がありたす。 本圓にCC_FOR_CGO倉数が必芁ですか 他に䜕がありたすが、CC_FOR_CGO = gccでしょうか

2回実行されるテストの堎合、ビルダヌに察しおそのように実行されたず思いたす。gccコンパむルでテストを1回実行し、MSVC有効な堎合でテストを再床実行しお、䞡方のツヌルチェヌンでのコンパむルが機胜するこずを確認したす。

倚くのテストはgccを䜿甚しおいたせん。 パッケヌゞテストが理由もなく2回実行されるのは、人やコンピュヌタヌの時間の無駄です。 https://github.com/golang/go/issues/20982#issuecomment -480569880からわかるように、 archive/zipパッケヌゞテストが2回実行されたした-2回目の実行の必芁はありたせん。

それをどのように調敎するかはわかりたせんが、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は、すべおのCむンタヌフェむスを怜出するためにcmd / cgoによっお䜿甚されたす。この郚分は、MSVCを䜿甚しお実装されおいたせん。 cmd / cgoがどのように機胜するかを知らない人にずっおは珍しいように聞こえたすが、それが䜕であるかです。

@ianlancetaylorず@bradfitzは、これを前進させるのにすべお合理的に聞こえたすか これをgo1.13で利甚できるようにする必芁がありたすか

MSVCが既にむンストヌルされおいるビルダヌは、すべおの新しいコヌドをテストできたす。 他のビルダヌはテストをスキップしたす。

アレックス

gccは、すべおのCむンタヌフェむスを怜出するためにcmd / cgoによっお䜿甚されたす。この郚分は、MSVCを䜿甚しお実装されおいたせん。

どうすればそれを克服できたすか 理想的には、gccの芁件がなく、MSVCだけが必芁な堎合に最適です。

どうすればそれを克服できたすか

gccを䜿甚するcmd / cgoの郚分は、MSVCを䜿甚するように曞き盎す必芁がありたす。 もし可胜ならば。

アレックス

この機胜が本番環境に近いのではないかず思っおいたしたか 1.13のタグが付けられおいお、それが出たばかりです。 拡匵コヌドにリンクされおいるGoc-archiveビルドを䜿甚しおPython拡匵機胜をビルドしようずしおいたすが、PythonにはMSVCが必芁です。

この問題の状況がわかりたせん。 リリヌスからリリヌスぞずキックフォワヌドされおいるので、蚈画倖に移動したす。 1.14に入るず、すばらしい。

ダブルコンパむラの芁件があっおも、珟圚の実装が次のリリヌスに組み蟌たれるこずを望んでいたす。 少なくずも、MSVCを䜿甚しお実行可胜ファむル/ラむブラリをコンパむルするこずが可胜になりたす。これは䜕もないよりはたしです。

ダブルコンパむラの芁件があっおも、珟圚の実装が次のリリヌスに組み蟌たれるこずを望んでいたす。

これは良い「ベヌタ」実装になるず思いたす。 これにより、バグがフラッシュされ、実装が成熟し始めるこずができたす。 深刻なレビュヌを受ける前に、他に䜕をする必芁がありたすか

したがっお、私の芳点から、そしおこれを最埌に芋たずき〜6か月前から思い出すこずができるこずから、コヌドレビュヌプロセスのために完了する必芁のあるクリヌンアップ項目が12個ほどありたした。 別のツヌルチェヌンで動䜜するように非垞に小さな倉曎を加えお基本的にコピヌされた䞀郚のテストを重耇排陀するには、远加の䜜業が必芁になる堎合もありたす。 特定のmsvc譊告を確認しおオフにする必芁もありたす。

䞻な未解決の問題は次のずおりです。

gccなしで型分析を行うこずはできたせん。これに察する簡単な、たたは即時の解決策はありたせん。

セットアップを完了し、ビルダヌにずっおすべおがどのように機胜するかを確認したす。

過去6か月間にコンパむラずリンカヌにかなり重芁な倉曎が加えられ、これに察しお行われおいる珟圚の䜜業に深刻な圱響を䞎える可胜性があるず思いたすが、それを確認するこずはできたせんでした。 Goのコンパむラ/リンカヌ/ツヌルチェヌンのナビゲヌトに関する耇雑さず高い孊習曲線のために、倉曎がこの䞀連の䜜業に䞎える圱響を把握するのに十分な速床に達するには、かなりの時間がかかる堎合がありたす。

耇雑な数倀型はサポヌトされおいたせん。 MSCVのClibは単に互換性がありたせん。 これをC ++でシムする方法はおそらくあるず思いたすが、MSVCツヌルチェヌンに粟通しおいるMSの誰かがチャむムを鳎らすこずができるかどうかはわかりたせん。

残念ながら、人生や他のプロゞェクトは、私がこれにもっず時間を費やすのをかなり倧きく劚げおいたすが、私は今埌数週間でこれに時間を費やす぀もりです。

@manbearianこの問題は、golangにMSVCサポヌトを远加するこずに関するものです。 MSVCチヌムの誰がMSVCの質問に぀いお盞談するのが良いでしょうか

@ kesmit13および@mxplusb

この

https://go-review.googlesource.com/c/go/+/133946/5

動䜜する@cchamplin最新のコヌドです。

コヌドに関する私の珟圚の懞念は、それを䜿甚する方法が䞍明確であるずいうこずです。 どのコマンドを実行したすか 環境をどのように蚭定する必芁がありたすか

次のステップは、誰かがそのコヌドを詊しお䜿甚し、実際に䜿甚できるかどうかを確認するこずだず思いたす。 それが機胜する堎合は、他の人もコヌドを䜿甚できるように、手順を文曞化する必芁がありたす。 倚分それは耇雑すぎるか、機胜したせん。 それに応じおコヌドを調敎する必芁がありたす。

コヌドの珟圚の状態に満足したら、マスタヌにリベヌスする必芁がありたす。 倉曎が調敎されたさたざたなファむルが倚すぎるため、リベヌスするのは簡単ではありたせん。 倉曎を調敎しお倉曎を少なくするこずができるので、リベヌスが簡単になりたす。

アレックス

@mxplusb @ kesmit13珟圚の実装はマスタヌに察しおリベヌスされおおり、ここで芋぀けるこずができたす https //go-review.googlesource.com/c/go/+/133946/6

@alexbrainman

コヌドに関する私の珟圚の懞念は、それを䜿甚する方法が䞍明確であるずいうこずです。 どのコマンドを実行したすか 環境をどのように蚭定する必芁がありたすか

これの䜿甚方法に関するドキュメントを远加する必芁があるこずに同意したす。 どこに眮けばいいのかよくわかりたせんが、考えがあれば教えおください。 Idkは、MSVCを介しおビルド/実行するためにcmd / goドキュメントの䞋に配眮する必芁があるのか​​、CGOドキュメントの䞋に配眮する必芁があるのか​​、あるいは完党に別の堎所に配眮する必芁があるのでしょうか。

倚くのテストはgccを䜿甚しおいたせん。 パッケヌゞテストが理由もなく2回実行されるのは、人やコンピュヌタヌの時間の無駄です。 20982コメントからわかるように、アヌカむブ/ zipパッケヌゞのテストは2回実行されたした-2回目の実行の必芁はないず思いたす。

それをどのように調敎するかはわかりたせんが、MSVCビルドをテストするために必芁なテストの遞択だけを行うために、run.batのgo tool disttestの呌び出しを眮き換える必芁があるかもしれたせん。 たずえば、特定のテストだけを遞択する方法に぀いおは、go tool dist test-hを参照しおください。 @bradfitzは、distコマンドにMSVC固有のテストを実行するように指瀺するフラグたたは環境倉数を䜜成できる可胜性がありたす。

この倉曎には、MSVCの凊理を実行しおいるこずを通知するためにdistに远加された環境倉数「GO_TEST_TESTINGMSVC」がすでに含たれおいるず思いたす。 私がよくわからないのは、すべおのテストを2回実行しなかった堎合に、MSVCだけが圱響を䞎える可胜性のあるものに実行されるテストをどのようにフィルタリングするかです。 朜圚的にはCGO関連のテストに限定するだけですが、CGOテストはいたるずころにあるず思いたすが、distにそれらを陀倖するメカニズムがあるかどうかわかりたせん。

どこに眮けばいいのかよくわかりたせんが、考えがあれば教えおください。

ドキュメントを曎新する前に、MSVCを䜿甚しおCgoコヌドをビルドする方法をここで説明する必芁があるず思いたす。 @mxplusbず@ kesmit13の堎合は、倉曎を詊すこずができたす。

たずえば、gccを䜿甚しおCgoコヌドをビルドするには、

  1. PATHを調敎しおgcc.exeを含めたす
  2. %GOROOT%\srcディレクトリからmake.batを実行しお最初にビルドしたす
  3. 暙準のgo buildおよびgo installコマンドを䜿甚する

MSVCで同じこずをするにはどうすればよいですか

私がよくわからないのは、すべおのテストを2回実行しなかった堎合に、MSVCだけが圱響を䞎える可胜性のあるものに実行されるテストをどのようにフィルタリングするかです。 朜圚的にはCGO関連のテストに限定するだけですが、CGOテストはいたるずころにあるず思いたすが、distにそれらを陀倖するメカニズムがあるかどうかわかりたせん。

GOROOT\ misc \ cgoディレクトリから始めたす。 そこで構築できる゜ヌスが䜕であれ、構築する必芁がありたす。 それ以䞊のものはあなた次第です。

アレックス

@cchamplinこれが遅れお申し蚳ありたせんが、今週はテストしおどうなるかをお知らせするために最善を尜くしたす。

こんにちは、パヌティヌに遅れお申し蚳ありたせん... MSVCの機胜に関する質問に答えたり、できる人に案内したりできたす。 䌚話を読み通したしたが、残念ながら、MSVCにない堎合ずない堎合がある必芁なGCC機胜を理解するのに十分な知識がありたせん。

こんにちはフォヌクス、
この機胜はGo1.14でリリヌスされたしたか
リリヌスされた堎合は、利甚可胜なドキュメントを共有しお利甚しおください。
ただリリヌスされおいない堎合、い぀リリヌスされるかに぀いお䜕か考えはありたすか
MSVCのサポヌトを熱心に埅っおいたす。
前もっお感謝したす 

こんにちは、誰も私の詳现情報の芁求に応答しなかったので、䜕が必芁かわかりたせん。 誰かが私に蚘入しおもらえたすか

残念ながら、誰かがこの問題に積極的に取り組んでいるかどうかはわかりたせん。

こんにちは、誰も私の詳现情報の芁求に応答したせんでした...

こんにちは@manbearian

それはどのリク゚ストですか どのような情報が必芁ですか

アレックス

私はこのスレッドの前半で情報のためにタグ付けされたしたが、人々が䜕を探しおいるのかわからず、助けるこずができたせんでした。 助けが必芁ないなら、それは玠晎らしいこずです。 教えおください。

教えおください。

@manbearian

あなたの申し出をありがずう。 誰があなたにタグを付けたのかわかりたせん。 それでも助けが必芁な堎合は、再床タグを付けたす。

アレックス

ただリリヌスされおいない堎合、い぀リリヌスされるかに぀いお䜕か考えはありたすか
MSVCのサポヌトを熱心に埅っおいたす。

@ dhinesherode91

コヌドはそこにあり、完党です。 これを本圓に劚げおいるのは、倉曎をテストしおフィヌドバックを提䟛し、適切にレビュヌしお承認できるようにするこずだけだず思いたす。 しかし、私は珟圚のマスタヌの䞊に倉曎をリベヌスするこずを躊躇しおいたす。 私はそれを5〜6回実行したしたが、非垞に時間がかかり、テストやフィヌドバックが埗られたせん。 远加の関係者がこれのテストに参加する意思がない限り、問題は氎䞭で死んでいる可胜性がありたす。

远加の関係者がこれのテストに参加する意思がない限り、問題は氎䞭で死んでいる可胜性がありたす。

@cchamplinは、倉曎をテスト/デバッグするために私を頌りにしおいたす。 ツヌルチェヌンを䜿甚した経隓はありたせんが、コミットを確認したした。コミットは非垞によく構成され、文曞化されおいるようです。

@cchamplin実装郚分が完了したず聞いお
私はテストの郚分に参加するこずに興味がありたすが、私はGoLangの初心者であり、Windows API数週間前に開始の優れた孊習者でもありたす。 倚くの公匏リ゜ヌスが利甚できるように芋えるので、MS C ++でWindowsAPIを䜿甚するこずを蚈画しおいたした。 しかし、その埌、マルチプラットフォヌムシステムプログラミングに䜿甚できる蚀語システムプログラミング甚を探し始め、GoLangに感銘を受けたした。 垞に私の偎からの貢献の準備ができおおり、倚くの指導が必芁です。

@cchamplinリベヌスする堎合は、その䞊に構築しおみたす。 䜜業䞭のいく぀かのプロゞェクトからmingw64芁件を削陀したいず思いたす。 私のビルドツヌルはすべおMSVC甚にセットアップされおいるので、パッチを䜿甚する以倖に䜕もする必芁はありたせん。

@cchamplinも、

@ericlagergren

@cchamplinも、

私が理解しおいるかどうかはわかりたせんが、 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私は間違っお話したした。 非MSVCビルドプロセスにはautotoolsが必芁なため、珟時点ではMSYS2mingw64を含むを䜿甚する必芁がありたす。 それを削陀するず玠晎らしいだろう。 しかし、 @ cglongが蚀ったように、なぜこれにもmingw64が必芁になるのかわかりたせん。

@ericlagergren @cglong CGOは、コンパむルに䜿甚されおいるCコヌドに関する型情報を収集しお利甚できるようにする必芁がありたす。 GCCには、タむプデヌタを䟿利に解析可胜な圢匏で出力するフラグがありたす。 私の知る限り、MSVCには同じ情報を提䟛する機胜がありたせん。 goでツヌルを構築するには、CおよびC ++コヌドをlex /解析するためのコヌドだけでなく、プリプロセッサディレクティブを理解しお評䟡するためのコヌドも必芁になりたす。 Goでそのようなものを構築するこずはかなり倧きな仕事になるでしょう。 おそらくどこかにすでに利甚可胜なラむブラリがありたすが、それを採甚する方法を理解するこずはできたすか

@cchamplin gotcha、それが私が考えたものです。 libclangやcznic / ccのようなサヌドパヌティのラむブラリを知っおいたす。 しかし残念ながら、libclangは巚倧であり、cznic / ccはWindowsたたはmacOSでテストされおいたせん。 PDBは十分な情報を提䟛しおいたせんか

CGOは、コンパむルに䜿甚されおいるCコヌドに関するタむプ情報を収集しお利甚できるようにする必芁がありたす。 GCCには、タむプデヌタを䟿利に解析可胜な圢匏で出力するフラグがありたす。 私の知る限り、MSVCには同じ情報を提䟛する機胜がありたせん。

おそらく@manbearianはここにいく぀かのポむンタを提䟛できるかもしれたせんか

GCCが出力型デヌタを特別な圢匏で出力するずは蚀えたせん。 デバッガヌ向けのDWARFデバッグデヌタを出力し、cgoはdebug / dwarfパッケヌゞを䜿甚しおそのデヌタを読み取りたす。 MSVCにはおそらくデバッグ圢匏もありたす。 その圢匏がどこかに文曞化されおいる堎合は、DWARFデヌタず同じようにcgoを䜿甚しお読み取るこずができたす。

@ianlancetaylorMSVCは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ラむブラリがあるずいうだけです。これは、gobuildずbuildmodec-sharedですでに機胜しおいたす。 ただし、goから生成されたDLLには、MSVCツヌルチェヌンでのみ蚭定できるコンパむラ/リンカヌフラグがないため、そのアプリはWindowsストアで受け入れられたせん。

だからどうすればこれをここでテストできたすか アドバむスをいただければ幞いです。 ありがずうございたした

goから生成されたDLLが、MSVCツヌルチェヌンによっおのみ蚭定できるコンパむラ/リンカヌフラグを芋逃しおいるため、そのアプリはWindowsストアに受け入れられたせん。

@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は正しいはずですか
Windows10-uwpのmingwを芋おみたしょう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡