繁体   English   中英

是否可以在基于Linux的系统上使用gcc或g ++进行静态编译?

[英]Is it possible to compile statically with gcc or g++ on Linux based systems?

我正在开发一个项目,我希望它可以作为没有依赖项的完整可执行文件“运送”到其他基于Linux的计算机。 (为了使我可以仅将1个文件复制到其他系统,然后在那些系统上运行该文件。)

在Windows世界中,我认为静态链接是通过将-static传递给编译器来完成的,如果使用的是Visual Studio,也许还可以使用某些其他选项来实现特定的库*。

*例如:由于某些原因,您还必须使用SFML定义SFML_STATIC?

使用gcc / g ++是否可行?如果可以,怎么办? 我尝试搜索此文件,但没有找到任何东西。 我以前听说过,这可能是一项不平凡的任务。

编辑:

BasileStarynkevitch建议使用flag -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的系统上使用gcc或g ++进行静态编译?

这取决于。

您可能会尝试使用gcc -staticg++ -static编译和链接所有代码。 在某些情况下(例如纯命令行应用程序,例如您的hello world),它会起作用。

Linux发行版就像很多共享库。 他们中的大多数人都在广泛使用共享库(特别是对于图形应用程序)。 有关更多信息,请阅读Drepper的“ 如何编写共享库”文章。

您可能会遇到一些许可问题。 为简化起见,以静态方式链接到某些LGPL(或GPL)库的代码可能是违法的(违反LGPL许可证)。 罪恶在于细节。

一些核心功能,尤其是与DNS相关的核心功能(例如getaddrinfo(3)getnameinfo(3) )在内部使用了la laopen(3)插件技术,因此排序需要动态 libc.so (有关信息,请参见nsswitch.conf(5)) 。更多)。

一些X11的东西,特别是字体相关的东西,也期望插件相关的东西(IIRC,Xft); 也许SFML使用它们。 顺便说一句,SFML很可能是作为共享库安装的,因此您需要从源代码重建SFML。

最后,与动态链接程序相比,静态链接程序可能与某种特定的内核版本更紧密地联系在一起(原则上不是这种情况)。 您可能会与非常老或将来的内核不兼容(但通常不是)。

另请参见ldd(1)file(1)pmap(1)proc(5)vdso(7)

将源代码运送到目标系统实际上可能更简单,要求sysadmin安装所需的依赖项,并在远程目标上构建代码(例如,使用ssh

您可以尝试通过玩GCC链接选项来静态链接大多数库,但不能全部链接(例如,静态链接libstdc++.a和动态libc.so )。

也许您首先应该尝试静态链接一些SFML演示...。或者干脆scp (动态链接)的二进制程序并尝试远程运行它(它可能能够运行)。

使用-static编译似乎适用于基本的c ++程序,可能是所有标准库?

但是,当与其他库一起使用时,这可能不再起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM