- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
请帮助理解 CGO_ENABLED 何时是必须且不可避免的,以及 go 编译过程会发生什么。
当 CGO_ENABLED 是必须的
在阅读了 引用 中的文章后,它似乎对目标平台有交叉编译原生支持, CGO_ENABLED 永远不会是必须的。它是否正确?
当 cgo 和 CGO_ENABLED 是绝对必须的情况是当 go 编译器无法为目标平台生成二进制代码时。例如,假设我正在用 Go 编写一个 Space X 控制板嵌入式程序,我必须使用 C 库和板的编译器。该板没有其他可用的库或编译器。
在这种情况下,我必须执行 CGO_ENABLED=1 并告诉 cgo 要使用的编译器和链接器以及 C 库二进制文件在我的笔记本电脑中的复制位置,并设置编译器 CFLAGS 等。也许我必须在这种情况下,使用 C 进行所有编码而不是使用 Go,但不知何故,我不得不使用 Go。这是 CGO_ENABLED=1 必须的时候。它是否正确?
否则,如果 Go 特别支持目标平台交叉编译,使用 CGO_ENABLED=1 可能是为目标平台重新使用现有 C 库的捷径。这是正确的还是需要 CGO_ENABLED 的任何其他原因?
发生什么了
我想当使用 CGO_ENABLED=1 时,基本上会有来自Go部分的二进制文件和 go build 命令创建的可执行文件中来自C库的二进制文件的组合。并且在运行时,执行在 go 和 C 两个二进制世界之间来回执行。go 二进制端不知道 C 端,因此调试器等 go 工具将不可用。
我想可执行文件是硬链接(hard link)所有库还是使用动态链接取决于目标平台编译器。
这些是正确的理解吗?
CGO_ENABLED=0 默认交叉编译的原因是因为我们应该使用目标平台交叉编译的go内置支持,没有理由不这样做。
CGO_ENABLED=1 默认情况下本地本地平台的原因是因为 cgo 编译器知道(或编译器的作者知道)本地机器架构和可用的操作系统库(或众所周知的第 3 方),因此最佳优化可以期待吗?但我不确定这是不是真的,因为 go 编译器本身可以针对本地操作系统和架构进行最佳优化,那么为什么需要使用 cgo 呢?
请解释为什么 CGO_ENABLED=1 默认为本地本地平台。
引用
Some people, when confronted with a problem, think “I know, I’ll use cgo.” Now they have two problems.
cgo is an amazing technology which allows Go programs to interoperate with C libraries. It’s a tremendously useful feature without which Go would not be in the position it is today. cgo is key to ability to run Go programs on Android and iOS.
However, and to be clear these are my opinions, I am not speaking for anyone else, I think cgo is overused in Go projects. I believe that when faced with reimplementing a large piece of C code in Go, programmers choose instead to use cgo to wrap the library, believing that it is a more tractable problem. I believe this is a false economy.
Obviously, there are some cases where cgo is unavoidable, most notably where you have to interoperate with a graphics driver or windowing system that is only available as a binary blob. But those cases where cgo’s use justifies its trade-offs are fewer and further between than many are prepared to admit.
Go’s support for cross compilation is best in class. As of Go 1.5 you can cross compile from any supported platform to any other platform with the official installer available on the Go project website.
By default cgo is disabled when cross compiling. Normally this isn’t a problem if your project is pure Go. When you mix in dependencies on C libraries, you either have to give up the option to cross compile your product, or you have to invest time in finding and maintaining cross compilation C toolchains for all your targets.
The number of platforms that Go supports continues to grow. Go 1.5 added support for 64 bit ARM and PowerPC. Go 1.6 adds support for 64 bit MIPS, and IBM’s s390 architecture is touted for Go 1.7. RISC-V is in the pipeline. If your product relies on a C library, not only do you have the all problems of cross compilation described above, you also have to make sure the C code you depend on works reliably on the new platforms Go is supporting — and you have to do that with the limited debuggability a C/Go hybrid affords you. Which brings me to my next point.
the compiler of the "reference" Go implementation (historically dubbed "gc"; that one, available for download from the main site) by default produces statically-linked binaries. This means, such binaries rely only on the so-called "system calls" provided by the OS kernel and do not depend on any shared libraries provided by the OS (or 3rd parties).
On Linux-based platforms, this is not completely true: in the default setting (building on Linux for Linux, i.e., not cross-compiling) the generated binary is actually linked with libc and with libpthread (indirectly, via libc).
The cgo tool is enabled by default for native builds on systems where it is expected to work. It is disabled by default when cross-compiling. You can control this by setting the CGO_ENABLED environment variable when running the go tool: set it to 1 to enable the use of cgo, and to 0 to disable it. The go tool will set the build constraint "cgo" if cgo is enabled.
When cross-compiling, you must specify a C cross-compiler for cgo to use. You can do this by setting the CC_FOR_TARGET environment variable when building the toolchain using make.bash, or by setting the CC environment variable any time you run the go tool. The CXX_FOR_TARGET and CXX environment variables work in a similar way for C++ code.
最佳答案
许多东西只能作为 C 库使用,并且在 Go 中重新实现所有内容的成本很高。 cgo 有其缺点,但它可以是一个很好的权衡。甚至标准库也使用它(net
用于 DNS 查找,os/user
用于用户查找),因为它不会 100% 地重新实现 Go 中的行为。
交叉编译 C 代码仍然相当困难;您将需要目标架构的 C 编译器和工具链(例如 CC=aarch64-linux-musl-gccgo build
来构建 arm64 二进制文件)。默认情况下都没有安装,因此对于大多数人来说,cgo 在交叉编译时根本无法工作;他们需要先手动进行设置。
cgo 通常不是严格要求的(例如在 net 和 os/user 包中),因此默认禁用它似乎是最用户友好的选项。
但是在原生平台上没有这样的限制,并且预计在没有任何用户设置的情况下默认工作;那么为什么不默认启用它呢?
关于go - 必须使用 CGO_ENABLED 时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61515186/
我感到困惑...... 我在 .jsp 中编写了一个小例程。最后需要关闭ResultSet、Statement和Connection。我也在finally { }中编写了结束代码,但是当页面运行时,它
我在 Stack Overflow 上读到一些 C 函数是“过时的”或“应该避免”。你能给我一些这种功能的例子以及原因吗? 这些功能有哪些替代方案? 我们可以安全地使用它们 - 有什么好的做法吗? 最
我正在构建一个应用程序,它可以拍照、显示图片,然后一旦被点击,就会在点击的任何地方返回图片的颜色。 它在崩溃之前到达了水龙头。我得到 x 必须是 < bitmap.width() 的错误 就我的理解而
我试图根据几个因素向用户提出建议: •建议只能是同一所大学的学生•建议必须至少匹配一个其他字段 我以为我有它,但问题是这个查询将返回同一所学校的所有学生,而不管其他情况: PUT /user/.per
我的应用程序必须从第三方读取 SSL 网址。我如何最好地将第三方凭证存储在我自己的数据库中,以保护第三方凭证不被泄露?兼顾绝对的安全性和实用性。对凭据进行单向哈希处理没有用,因为我必须将凭据恢复为明文
在我的 Rails API 中,我希望 Mongo 对象作为 JSON 字符串返回,Mongo UID 作为“id”属性而不是“_id”对象。 我希望我的 API 返回以下 JSON: { "
假设应用层协议(protocol)是通过UDP实现的。客户端需要超时,因此服务器需要保留与其通信的每个客户端的状态。 还假设使用了select。 实现多线程服务器总是最好的吗?我认为链接列表也会做同样
考虑一个非常短的程序,我在其中分配了一点内存。我被告知,GC 在程序分配大量内存并且分配达到限制的情况下运行。 我不知道这个限制到底是多少,但我认为它必须足够高,这样 GC 才不会频繁运行并减慢程序的
根据 Cocoa with Love当应用程序需要 WiFi(而不是蜂窝网络)时需要可达性,例如如果应用加载大量视频并且不适合在 3G 网络上使用。 我的应用程序使用互联网,无论是 WiFi 还是 3
我正在寻找更好的解决方案来解决我面临的这个问题。 如果您将鼠标悬停在缩略图上,它会淡出较大的镜头并淡入新的镜头,这很好,但是当转到目标缩略图并且您的鼠标再悬停一些时,它会更改为您的鼠标经过并拍摄的其他
启用 UAC 并使用管理帐户登录后,您将获得两个 token : 提升的 token ;这已启用 Administrators 组,具有高完整性(即强制性完整性标签 SID 为 S-1-16-1228
我想知道在 React 中创建动态选择组件的规范方法是什么。我是否必须创建一个单独的组件来根据下面的代码返回选项,以便能够通过每个条目的 props 自定义值,然后将它们包含到单独的选择组件中? p>
我有一个启用了分页的数据网格。我根据过滤条件在数据网格中显示结果。我已经过滤了数据,现在有 2 页。当我转到第二页时。我正在再次执行搜索功能以缩小结果范围。然后我收到类似“无效的 CurrentPag
我有原始文本列,其值类似于“2012-07-26T10:33:34”和“2012-07-26T10:56:16”。在使用 Joda-Time 的 Java 中,我可以通过调用 轻松地将其转换为日期/从
您好,我被分配了一项棘手的任务。我需要让一个方形 div 到达顶部的一个点。基本上它看起来像一个正方形 div,顶部有一个宽三 Angular 形。请参阅下面的屏幕截图。顶部的深蓝色只是堆叠在白色 d
我想知道,为什么我们在 android 中使用不同的启动器图标(大小)。目前您“必须”将图标大小调整为: LDPI - 36 x 36 MDPI - 48 x 48 HDPI - 72 x 72 XH
在 SO 的几个地方,声称必须知道对象的确切类型并基于此做出决定(以 if-then-else 方式)指向一个设计缺陷,例如here . 我想知道是否总是如此。在当前的一个小型教育项目(我正在使用它来
据我了解,迭代器是一种为客户端提供接口(interface)以观察/迭代/传递自定义集合等内容的机制,而不破坏信息隐藏原则。 STL 容器有自己的迭代器,所以我们可以毫无问题地对它们使用 for (
我在 Golang 中编写了一个包装函数,用于从多个文件中渲染模板,如下所示: func RenderTemplate(w http.ResponseWriter, data interface{},
据我了解,size_type 和 difference_type 的目的不仅仅是符号——它也是为了解决例如分段架构等,它们可能具有不同的大小。 在这种情况下,如果我有一个带有随机访问迭代器的容器,那么
我是一名优秀的程序员,十分优秀!