【问题标题】:Ubuntu Deployment Problem for a C++ ProjectC++ 项目的 Ubuntu 部署问题
【发布时间】:2011-07-08 00:59:34
【问题描述】:

我正在尝试将我的应用程序从开发环境部署到用户的计算机,但我遇到了一些问题。

首先,我在我的开发电脑(高版本Ubuntu11.04)上编译运行:

Ubuntu11.04$ make
Ubuntu11.04$ ./MyApp
Program runs okay.

然后我将二进制文件MyApp复制到两台低版本机器(用户的电脑):

Ubuntu10.04$ ./MyApp
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./MyApp)

Ubuntu8.04$ ./MyApp
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./MyApp)
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./MyApp)

但是,如果我在 Ubuntu10.04 上编译源代码并运行它:

Ubuntu10.04$ make
Ubuntu10.04$ ./MyApp
Program runs okay.

我该怎么办?在开发环境中编译时,如何设置使用的库的版本号?我没有直接使用 GLIBCXX,我认为它在我的项目中被隐式使用。

一百万。

彼得

【问题讨论】:

  • 不是一个真正的答案,但可能是一个替代方案:CDE (stanford.edu/~pgbovine/cde.html) 允许您打包一个包含所有依赖项的可执行文件。
  • 这是在另一台计算机上演示的快速解决方案,但我担心它不是一个完整的解决方案,因为我必须将我的应用程序部署给客户。

标签: c++ deployment ubuntu


【解决方案1】:

你看到Link with an older version of libstdc++

我从未安装过旧版本的 g++,但我在我的发行版中包含了一个 libstdc++.so,这对我很有用。我见过的最好的解决方案是让你的开发工作在最古老的系统上工作。我们在 Red Hat 9 上编译了一些东西,它适用于所有东西,但正如你所说,它可能是在旧机器上构建的任何主要问题。

【讨论】:

  • 嗨,保罗,谢谢您的回复。 As for setting up your build system to use only a specific version of the compiler: make sure the standard g++ can't be used (rename the link, remove the package providing it, take it out of PATH),这是什么意思?我必须安装旧版本的 g++?
  • 顺便说一句,正如你所说,如何but I have included a libstdc++.so in my release (我没有直接使用它,我认为它隐含地依赖于某处)。我也想这样做。我什至静态链接了 boost 库。 libstdc++.a有对应的静态版本吗?
  • 如果您在 /usr/bin/g++ 上执行所有操作,您会发现它链接到 g++-4.5。他们说您应该将其更改为指向旧版本。我还刚刚在 Ubuntu 11.04 上注意到 g++.4.4 在存储库中,您可以尝试安装它,并通过更改链接或仅使用 g++4.4 作为编译器来查看它是否有效。
  • 至于包含 libstdc++.so 您可以使用 LD_LIBRARY_PATH 并将其指向您要使用的所有共享库。谷歌地球就是一个很好的例子。在最新版本的 Google 地球上,我在 /opt/google/earth/free 中看到大量 .so 文件,它们都覆盖了系统版本。希望这是有道理的。
  • 感谢您的回复。我用谷歌搜索了 LD_LIBRARY_PATH,但有人建议我不要使用它。我发现另一种解决方案是将-static-libstdc++ 添加到链接标志中。
【解决方案2】:

您已经在版本 N 上构建,并尝试在版本 M 上进行部署,M

请记住,Ubuntu/Debian 社区已针对开源进行了优化。从他们的角度来看,解决方案是让您使用 auto* 工具分发源代码,并让用户为他或她自己构建它。他们不会熬夜,让您轻松搞定。

在这个封闭源代码的邪恶世界中,我们保留了运行各种旧 linux 发行版的虚拟机,以便我们可以构建在许多地方运行的单个二进制文件。

【讨论】:

  • 我也在考虑“学习编译和链接针对旧版本的过程”。假设我们允许 10.04 个用户运行我的应用程序,我们应该能够找出指定库的版本。也许,正如你所说,我们应该将我的开发环境降级到 10.04,但我担心我的开发工具无法在较低版本的机器上运行。非常沮丧:-(感谢您的回复。
  • 问题是我不知道 Ubuntu 是否会打包你需要的东西。
  • 如果您有一个非交互式的构建过程,那么您可以在较新的安装上进行开发,并有一个(半)自动化的过程来构建二进制文件以在较旧的安装上进行部署。如果您构建了一个合适的 Debian 软件包,您可以使用现有的自动构建器。
  • 嗨,西蒙,感谢您的回复。我正在使用 CMake 生成我的项目 Makefile。然后我做mkdir build; cd build; cmake .. -DCMAKE_BUILD_TYPE=Release; make 来生成。我用谷歌搜索,还发现 CMake 支持 Debian 打包,但我找不到一个很好的教程。也请看看这个:stackoverflow.com/questions/6601403/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2015-10-18
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多