如何在任何地方编译 g++ 应用程序和 运行?

how to compile g++ app and run anywhere?

我的程序编译并运行良好:

g++ main.cpp exm1.cpp exm2.cpp -o main.o

我想在任何地方运行编译这个应用程序
我怎么可以?
我试试这个代码

g++ -g -Wall -I/MyApp/lib -static-libgcc -static-libstdc++ -static main.cpp exm1.cpp exm2.cpp -o main.o

但不起作用
在 lib 文件夹中有 2 个文件:

#include <fstream>
#include <iostream>
#include <string>
#include <streambuf>
#include <stdlib.h>
#include "lib/exm1.h"
#include "lib/exm2.h"

我的 linux 是 kali,我想要 运行 这个应用程序在 CentOS 6
请帮助我,谢谢

所以从评论来看,一个原因可能是您的可执行文件是 64 位的,而 centOS 是 32 位系统。尝试使用 -m32 标志进行编译。

正如 C.bear 所说,使用 -m32 标志以便程序能够在 64 位和 32 位系统上 运行。为此,您还必须安装 32 位标准库。我不确定如何在 kali 上执行此操作,给它一个 google。避免让用户安装外部库(如果你在任何时候使用它们)你可以做的另一件事是静态 link 你的可执行文件。使用 -static 标志来执行此操作。但是,因为您应用程序的所有依赖项(包括标准库)都在一个文件中,所以它会变得相当大。另一方面,加载时间会更好,因为您的应用程序不必 运行 动态 linker 并等待它 link 您调用的外部库。

how to compile g++ app and run anywhere?

这并不容易。例如,ELF executable produced by GCC on a recent Debian/x86-64 computer won't run on a RaspberryPi(对于 ARM 32 位,linux,例如一些 Raspbian)

阅读更多关于 execve(2), elf(5) and about fat binaries

请注意,GCC 编译器套件可以(从其源代码)构建为交叉编译器(但您需要为每个不同的目标系统重建 GCC)。

我建议在调试阶段以 g++ -Wall -Wextra -g 调用 GCC(并使用 GDB)。调试完软件后,使用 g++ -Wall -Wextra -O2 编译它以获得优化的二进制文件(甚至编译并 link 使用 g++ -Wall -Wextra -O3 -flto