我的程序已编译并正常运行:
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上运行这个应用程序 请帮帮我,谢谢
答案 0 :(得分:1)
正如 C.bear 所说,使用 -m32
标志使程序能够在 64 位和 32 位系统上运行。为此,您还必须安装 32 位标准库。我不确定如何在 kali 上执行此操作,请使用谷歌搜索。为了避免让用户安装外部库(如果您在任何时候使用它们),您可以做的另一件事是静态链接您的可执行文件。使用 -static
标志执行此操作。但是,因为您的应用程序的所有依赖项(包括标准库)都将位于一个文件中,所以它会变得非常大。另一方面,加载时间会更好,因为您的应用不必运行动态链接器并等待它在您调用外部库时链接它们。
答案 1 :(得分:0)
因此,根据评论,一个原因可能是您可执行的是64位,而centOS是32位系统。尝试使用-m32
标志进行编译。
答案 2 :(得分:0)
如何编译 g++ 应用程序并在任何地方运行?
这不容易。例如,ELF 在最近的 GCC/x86-64 计算机上生成的 Debian 可执行文件不会在 RaspberryPi 上运行(对于 ARM 32 位的 linux,例如一些 Raspbian)
阅读有关 execve(2)、elf(5) 和 fat binaries 的更多信息
请注意,GCC 编译器套件可以(从其源代码)构建为交叉编译器(但您需要为每个不同的目标系统重建 GCC)。
我建议在调试阶段调用 GCC 作为 g++ -Wall -Wextra -g
(并使用 GDB)。调试完软件后,使用 g++ -Wall -Wextra -O2
对其进行编译以获得优化的二进制文件(甚至可以使用 g++ -Wall -Wextra -O3 -flto
进行编译和链接)