【发布时间】:2015-11-20 08:48:47
【问题描述】:
我正在从事一个项目,我希望能够将其作为一个完整的可执行文件“运送”到其他基于 Linux 的计算机,并且没有依赖关系。 (为了我可以只将 1 个文件复制到其他系统,然后在这些系统上运行该文件。)
在 Windows 世界中,我认为静态链接只需将 -static 传递给编译器即可完成,如果您使用的是 Visual Studio,也许还可以为特定库提供一些其他选项*。
*eg: 使用 SFML 时您还必须出于某种原因定义 SFML_STATIC?
这可以使用 gcc / g++ 吗?如果可以,怎么做?我试图搜索这个,但没有找到任何东西。我之前听说这可能是一项艰巨的任务。
编辑:
BasileStarynkevitch 建议使用标志 -static 进行编译。
我不知道这是否是我想要的,但我写了一个测试程序来尝试一下:
#include <iostream>
int main()
{
std::cout << "Link statically please" << std::endl;
return 0;
}
然后编译为:
g++ main.cpp -o a.out -static
g++ main.cpp -o b.out
结果是:
-rwxr-xr-x 1 1653098 a.out
-rwxr-xr-x 1 9167 b.out
所以看起来它可能工作了?
TonyD 提出了一种检查方法:
ldd a.out
not a dynamic executable
ldd b.out
linux-vdso.so.1 => (0x00007fff3d5ac000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fce5e34a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce5df85000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce5dc7e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fce5e677000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fce5da67000)
【问题讨论】:
-
有可能,但可能不合理。你试过在 Linux 上使用
g++ -static吗? -
@BasileStarynkevitch 你能详细说明这一点吗?
-
恐怕这是不可能的,因为像 glibc 这样的一些系统绑定库在不同的 linux 系统上可能会有所不同。通常的方法是发送源包并在目标系统上配置和编译它们。
-
这是一个很好的问题,但没有研究工作....
-
@BasileStarynkevitch 为什么要将我的代码作为免费软件发布?对任何人都没有用?这是一个荒谬的问题。我想在我的组织内将我的代码形式机器移动到机器 - 不出售它。