我可以在编译时控制静态或动态库链接吗?每个都会创建差异吗?二进制大小?

sec*_*rve 4 compilation dynamic-linking go static-linking

在一次 Go 研讨会上,讲师表示,当他编译 Go 应用程序(静态链接)时,生成的二进制文件大小约为 600 MB 大,但是当他使用动态链接编译相同的应用程序时,生成的二进制文件变成了 10 MB MB。

我不确定他在说什么,编译期间的动态链接与静态链接是否会造成二进制空间的差异,我是否可以控制它?

wlr*_*eye 5

默认情况下,Go 使用静态链接,因此所有内容(您的代码和包源代码)都会编译在一个大的二进制文件中。

自 Go 1.5 发布以来,您可以使用或-buildmode=shared选项编译 Go 共享库。然后你可以使用flag 编译你的应用程序二进制文件。详细信息可以在这里找到。go buildgo install-linkshared

当然,如果您动态链接包,您的二进制大小将小于静态链接,但总应用程序大小不会减少,因为您只是“将代码放在其他地方”。因此,仅当您需要在不同应用程序之间共享相同的包时,动态链接才有意义。