[英]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 -static
或g++ -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.