从Go和C / C ++代码创建静态二进制文件(使用cgo)

我正在Go中开发一个应用程序,该应用程序需要调用我公司的某些C ++代码。到目前为止,我已经成功实现了以下目标:

  • 启用C ++对象实例化的书面C包装器
  • 将我的新C / C ++代码编译到共享库中
  • 构建我的Go代码时链接了共享库
  • 在Docker映像中构建代码

例如,以下内容当前有效:

$ export CGO_LDflaGS="-L${PWD}/resources/lib (...) -lcompany -lxerces-c++ (...) -lstdc++ -no-pie"
$ export CGO_CflaGS="-I${PWD}/resources/inc"
$ export CGO_CXXflaGS="-I${PWD}/resources/inc
$ go build . -o /bin/app

我想减小最终Docker映像的大小。我正在使用Buffalo web framework,因此,我正在使用其Docker映像构建我的应用程序。图像的最终大小(包括我的团队的库等之后)超过3 GB。

Buffalo团队建议将应用程序构建为静态二进制文件,如下所示:

$ buffalo build --static -o /bin/app                                       # buffalo
$ go build -o /bin/app -ldflags -linkmode external -extldflags "-static"   # go

但是,运行这些命令给我带来了很多“未定义参考”错误。例如,在上面的示例中,我链接的xerces-c++库提供以下内容:

/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:141: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:142: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:147: undefined reference to `curl_multi_add_handle'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:159: undefined reference to `curl_easy_getinfo'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:124: undefined reference to `curl_slist_append'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:102: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:99: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:89: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /usr/local/vicar/external/xerces-c++/v3.0.0_rhel6/src/src/xercesc/util/Netaccessors/Curl/CurlURLInputStream.cpp:90: undefined reference to `curl_easy_setopt'

通过libcurl4安装apt-get install libcurl4并将其与-lcurl链接,我得以解决此错误,但是 it 抱怨未定义的引用。它一直在继续。

鉴于这种情况,我的问题如下:

  • 列出所有这样的库是否对实现我想要的东西必不可少?没有更好的选择了吗?
  • 我可以通过另一种方式实现减小Docker映像大小的最终目标吗?

感谢您抽出宝贵的时间。让我知道是否可以提供更多信息,以使解决此问题变得更加容易。

更新:通过使用多阶段构建,我已经能够将最终的Docker映像调整为合理的大小(约600MB)。但是,我仍然想知道原始问题的答案,因此暂时不回答这个问题。

zhuzhuxiangw 回答:从Go和C / C ++代码创建静态二进制文件(使用cgo)

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3105251.html

大家都在问