C++ 静态编译一个C++;将带有GCC的应用程序转换为二进制

C++ 静态编译一个C++;将带有GCC的应用程序转换为二进制,c++,windows,unix,gcc,compiler-construction,C++,Windows,Unix,Gcc,Compiler Construction,如何在面向unix的Ubuntu机器上静态编译带有GCC的应用程序?我如何针对32位/ 64位机器和不同版本的GLYBC机器或UNIX C++应用程序通常依赖什么?然后,我想以二进制形式分发此应用程序,并在unix计算机上运行它,而无需从源代码进行编译 类似地,我可以编译它以便在Linux上运行吗?只需像这样编译它: g++ -o myapp myapp-a.cop myappb.cop -L mylib1 这应该适用于大多数版本的Linux,也适用于某些版本的FreeBSD 这不会静态地链接

如何在面向unix的Ubuntu机器上静态编译带有GCC的应用程序?我如何针对32位/ 64位机器和不同版本的GLYBC机器或UNIX C++应用程序通常依赖什么?然后,我想以二进制形式分发此应用程序,并在unix计算机上运行它,而无需从源代码进行编译


类似地,我可以编译它以便在Linux上运行吗?只需像这样编译它:

g++ -o myapp myapp-a.cop myappb.cop -L mylib1
这应该适用于大多数版本的Linux,也适用于某些版本的FreeBSD

这不会静态地链接到libstdc++,但这可能是一个更好的方法。根据经验,即使系统调用abi发生变化,您也应该动态链接OS c库,以允许您的应用程序工作

您可以强制从64位计算机进行32位编译,并将“-m32”作为您的标志之一。它将编译模式设置为32位


至于在Windows上编译:是的。你能做到。这叫做交叉编译。您首先需要编译一个针对Linux的工具链

要编译它以便在Linux上运行,只需像这样编译它:

g++ -o myapp myapp-a.cop myappb.cop -L mylib1
这应该适用于大多数版本的Linux,也适用于某些版本的FreeBSD

这不会静态地链接到libstdc++,但这可能是一个更好的方法。根据经验,即使系统调用abi发生变化,您也应该动态链接OS c库,以允许您的应用程序工作

您可以强制从64位计算机进行32位编译,并将“-m32”作为您的标志之一。它将编译模式设置为32位


至于在Windows上编译:是的。你能做到。这叫做交叉编译。您首先需要编译一个针对Linux的工具链

这就是如何创建静态编译的32位纯可执行文件的方法,它应该可以在任何已知的Linux上工作,而不会抱怨缺少libs:

g++ -m32 -static -o myprog myprog.cpp
这样做的一个缺点是可执行文件的最小大小至少为600 KB


注意:如果您遇到编译错误,请确保安装了包
g++-multilib

这就是创建静态编译的仅32位可执行文件的方法,该文件应可在任何已知Linux上运行,而无需抱怨缺少库:

g++ -m32 -static -o myprog myprog.cpp
这样做的一个缺点是可执行文件的最小大小至少为600 KB


注意:如果您遇到编译错误,请确保安装了包
g++-multilib

通常不能“针对Unix”。如果构建Linux二进制文件,它将仅在Linux系统上运行。FreeBSD有一个Linux兼容层,但这是唯一的例外。二进制文件不会在Mac OS X、Solaris或其他Unix系统上运行。如果您想在不同的Unix机器上使用clib和标准库的不同版本进行验证,您需要标记-static libgcc和-static libstdc++。这会将它们嵌入到文件中,这样您就不会依赖系统上的.so文件run@Rolle-您能添加您的评论作为回答吗?它非常有用。一般来说,您不能“以Unix为目标”。如果构建Linux二进制文件,它将仅在Linux系统上运行。FreeBSD有一个Linux兼容层,但这是唯一的例外。二进制文件不会在Mac OS X、Solaris或其他Unix系统上运行。如果您想在不同的Unix机器上使用clib和标准库的不同版本进行验证,您需要标记-static libgcc和-static libstdc++。这会将它们嵌入到文件中,这样您就不会依赖系统上的.so文件run@Rolle-您能添加您的评论作为回答吗?它非常有用。不幸的是,此配方在使用不同版本的glibc或libstdc++的系统(如较旧的Linux系统)上不起作用,因为您不使用静态编译。不幸的是,此配方在使用不同版本的glibc或libstdc++的系统(如较旧的Linux系统)上不起作用因为您不使用静态编译。