编译 c++ 应用程序,以便它们也可以在其他计算机上工作

Posted

技术标签:

【中文标题】编译 c++ 应用程序,以便它们也可以在其他计算机上工作【英文标题】:compiling c++ applications so they can work on other computers as well 【发布时间】:2009-02-10 20:58:00 【问题描述】:

所以我有一个非常简单的 SDL 应用程序,我希望能够将其传递给我的朋友,而无需让他下载一大堆 SDL 包。

我该怎么做呢?我被告知使用这一行来编译: (请注意,我使用的是 ubuntu linux,我的朋友也是如此,而且这个应用程序可以在没有“-Wl,-Bstatic”选项的情况下编译和运行。)

g++ test-sdl.cpp -o test-sdl -Wl,-Bstatic -lSDL_image -lSDL

然后我得到这个错误:

/usr/bin/ld: 找不到 -lgcc_s collect2: ld 返回 1 个退出状态

为什么会出现这个错误?我如何解决它?我什至必须这样做吗?有没有不同/更容易/替代的方式?

我是否希望我的朋友免去下载他可能永远不会使用的软件包的麻烦?

谢谢。

【问题讨论】:

在我看来,SDL 不符合他可能永远不会使用的软件包的资格。除非他从不使用涉及图形的程序(例如游戏),否则他以后可能会发现自己会使用 SDL。 这是对最终用户的过多假设。 你没有抓住重点。今天它是一个 SDL 包,明天它可能是其他任何东西。我不会部署任何关于用户的应用程序。 【参考方案1】:

从长远来看,您最好的选择是弄清楚如何构建 .debs,然后您朋友系统的包管理可以负责安装所需的所有依赖项。如果您想更广泛地分发包,按预期使用平台的原生打包系统将为您和您的用户省去很多麻烦。

查看 Ubuntu 的 packaging 和 pbuilder 指南。

就个人而言,我从 Martin Krafft Debian book 那里学会了如何为我自己的项目(在 Debian 上)执行此操作,并发现使用 yada 可以大大简化流程。

【讨论】:

嗯,这似乎是一个更合乎逻辑的选择。通过让我通过我自己的 deb 为他安装 deb。有没有办法让我准确地确定哪些软件包是必需的(为了安装最少数量的软件包以使应用程序运行) 是的,请查看 dpkg-depcheck 的手册页 - 您应该能够在您的应用程序上使用它来获取您的应用程序在运行时所依赖的所有包的列表。 (我也见过其他涉及处理 strace 输出的方法)。【参考方案2】:

我认为你应该去掉 -B(这会改变搜索路径,参见 man g++,因此你再也找不到你的库了)。

你的意思是-static,没有B。

针对 cme​​ts 进行编辑:抱歉,不完整。相反,只需用“-static”替换所有“-Wl,-Bstatic”。

正如 codelogic 所写,-static 不是链接器的选项(-Wl 暗示)。

【讨论】:

这个:g++ test-sdl3.cpp -o test-sdl3 -Wl,-static -lSDL_image -lSDL 也不起作用。它返回相同的错误。 -static 不是链接器选项,它是 gcc 选项。 这个:g++ -static test-sdl3.cpp -o test-sdl3 -Wl,-lSDL_image -lSDL 和这个:g++ -static test-sdl3.cpp -o test-sdl3 -lSDL_image -lSDL返回一个相同的错误堆栈,如此之大,我的终端不记得足够多的行让我看到第一个错误输出。

以上是关于编译 c++ 应用程序,以便它们也可以在其他计算机上工作的主要内容,如果未能解决你的问题,请参考以下文章

如果我布置结构的字段以便它们不需要任何填充,那么符合标准的 C++ 编译器可以添加额外的东西吗?

编译程序时出现错误消息

C++ 版本,它们的含义,如何更新它们

C,C+和C++它们有什么区别

由于 int main() 函数的定义错误,C++ 编译器拒绝了我的代码

C++ 版本,它们会自动检测 exe 的版本吗?