如何在任何地方编译 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 个文件:
- exm1.h
- exm2.h
main.cpp 包括:
#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
)
我的程序编译并运行良好:
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 个文件:
- exm1.h
- exm2.h
main.cpp 包括:
#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
)