-
Notifications
You must be signed in to change notification settings - Fork 17.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cmd/go: give a better error message when building Go package with CGO_ENABLED=0 #24068
Comments
Did you run |
Yes, the two commands I used for comparison are:
The second one produces the "undefined" error message. |
Hmm .. same problem to me. It seems like |
cgo is disabled when cross compiling.
…On 23 February 2018 at 23:51, mingrammer ***@***.***> wrote:
Hmm .. same problem to me. It seems like go can not find source file
which import "C".
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#24068 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/AAAcA6QypqjQExMh4eOyNRD3rHH6LVhxks5tXrRTgaJpZM4SQ0Ut>
.
|
@davecheney I am aware, the issue in question is more about the lack of a proper error message instead of silently ignoring the affected files and thus causing "undefined" errors. |
Should all packages using cgo fail to build with CGO_ENABLED=0? That seems wrong to me - some standard library packages build both with and without cgo, such as os/user. |
Something else that comes to mind is a static analysis check (in vet?) that would say something along the lines of |
Even Regarding letting builds fail, I definitely don't think it should, but even building with All I'm asking for is more information for when this occurs. And you could potentially suppress any warnings/errors when the |
The Go compiler doesn't have a notion of warnings, so I guess another option, which is similar to what you're asking, is to make the compiler give a helpful message in this case. But, for it to know to do that, it would have to know that the package type-checks properly with CGO. That's a non-trivial amount of extra work involved. |
I'll leave that one to you/the team, as I have no knowledge of the compiler itself. I opened this issue as someone I had spoken to not too long ago was getting this same error without knowing why, and it wasn't until encountering it myself that I understood the cause of it. Any kind of message either in the compiler or even the documentation would be very helpful. The documentation ( https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command ) currently specifies that So even if the amount of work required to add a helpful compiler message is non-trivial, I'd imagine a slight addition to the documentation wouldn't be. |
Agreed that improving the documentation is an easy win - if you'd like to help, you're most welcome to. Should be easy now that we accept pull requests. |
Change https://golang.org/cl/96655 mentions this issue: |
One way we could do better would be for the go tool, if there is a compilation error, to report that some files were excluded due to build constraints (we already do that for the case where build constraints exclude all files). We could perhaps even pay closer attention to the cgo build constraint, and explicitly point the user to docs about the |
That is, we don't have the type check the package assuming a different set of build constraints. We just note that the compilation failed and print "by the way, the following files were not passed to the compiler due to build constraints: x.go ...". |
When using the special import "C", the "cgo" build constraint is implied for the go file, potentially triggering unclear "undefined" error messages. Explicitly explain this in the documentation. Updates #24068 Change-Id: Ib656ceccd52c749ffe7fb2d3db9ac144f17abb32 GitHub-Last-Rev: 5a13f00 GitHub-Pull-Request: #24072 Reviewed-on: https://go-review.googlesource.com/96655 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Compare #26967. |
While I can't speak for the complexity/reward ratio as rsc mentions, personally it would've saved me a few hours of debugging. That said, my personal problem was more along the lines of the cgo build tag being implied moreso than a build tag being enforced. |
I just recently experienced something similar when trying to cross-compile, I think that the error message should also print the build constraints being applied, i.e.:
if the constraints happen to exclude all files, then it'd be great if it printed something like the following:
In my case I was cross-compiling from Windows Subsystem for Linux to a windows target that had CGO files, I initially had not set Getting the applied build constraints would allow one to do the following:
It'd be great if the
|
imho the result is even worse if you consider the example of @ikkerens with any external package imported, e.g. // cgo.go
package main
import "C"
import "github.com/pkg/errors" // just an arbitrary package
func test() {
_ = errors.New("my error")
} Instead of This is really misleading and hard to track down... |
I can reproduce it without CGO_ENABLED involved. This compiler error is not precise. |
Just referencing this error is occurring in OpenBSD with the pkg pistol. After reviewing the thread, it appears a resolution was reached for this particular instance and Nixos, but it is unapparent if a resolution was reached regarding other operating systems and/or packages. Regardless of which, the proposed resolution...
...was not successful. |
I got this error in GoLand, it's an indexing error on GOPATH. See https://youtrack.jetbrains.com/issue/GO-12136/local-GoLang-package-giving-Unresolved-Reference-error#focus=Comments-27-5659613.0-0. |
When trying to cross compile the go compiler silently ignores any files that use
import "C"
statement.In this example I've tried to compile for windows on a linux host machine, but this issue seems to be present on other host platforms as well.
It seems to do this because it disables
CGO_ENABLED
being disabled by default when the host and target platform mismatch despite the required toolchains being present (mingw-w64 in my case).I managed to resolve this issue by enabling
CGO_ENABLED
and settingCC
andCXX
, but this issue is more about the unclear error message.What version of Go are you using (
go version
)?go version go1.10 linux/amd64
Does this issue reproduce with the latest release?
Yes.
What operating system and processor architecture are you using (
go env
)?Without GOOS:
With GOOS=windows
What did you do?
2 Go files:
What did you expect to see?
Some kind of warning that cgo.go is being skipped in compilation due to
CGO_ENABLED
being0
.What did you see instead?
The text was updated successfully, but these errors were encountered: