1

我正在用 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通过安装viaapt-get install libcurl4并将其与 链接,我能够消除此错误-lcurl,但随后抱怨未定义的引用。它会一直持续下去。

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

  • 列出所有像这样的库是实现我想要的必要的邪恶吗?没有更好的选择吗?
  • 我可以通过其他方式实现更小的 Docker 映像大小的最终目标吗?

感谢您抽出宝贵的时间。让我知道是否可以提供更多信息以更轻松地解决此问题。

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

4

0 回答 0