这可能是一个愚蠢的问题,但我是通过命令行编译C或C++项目的新手。我目前正在尝试交叉编译一些框架,以便在内置gcc5.4.0的aarch64设备中运行。但是,有些库至少需要gcc7.5.0。所以我的第一个问题是:
- 使用gcc7.5.0版本编译的框架是否可以在存在gcc5.4.0的环境中使用
此外,我试图在设备上运行的一些进程也需要gcc7.5.0。因此,我的第二个问题是:
- 使用gcc7.5.0编译的对象文件(.o,例如已编译的.c/.cpp文件的输出(能否在使用gcc5.4.0的系统上运行
最后,一些进程需要将在gcc5.4.0和gcc7.5.0中编译的库一起使用。因此,我必须链接由gcc5.4.0和gcc7.5.0生成的.so文件。因此,我的最后一个问题是:
- 可以通过将使用不同gcc版本编译的库一起使用来创建可执行文件吗
谢谢。
对于前两个问题:系统中是否存在编译器并不重要。我在没有安装编译器的机器上运行过软件(它是在其他地方编译的(。我在安装了一堆编译器的机器上运行过软件,其中包括g++的多个版本。
对于您的最后一个问题:当链接(静态地、在链接时或在执行时动态地(库时,重要的东西被称为ABI。ABI有两个方面:语言本身和标准库。对于这两者,GCC都保持了前向兼容性:使用最新的编译器和标准库,您可以链接到使用旧编译器(以及旧标准库(编译的对象文件,就像3.4一样。在一些更受限制的情况下(文档不太好(,您甚至可以使用旧的编译器和标准库。
如果您想执行一个动态链接的程序(这通常是GCC的默认值(,该程序使用比系统上的标准库更新的版本,则需要确保找到它。这是另一个主题,但这里有两个关键词可以帮助您找到Unix的信息(我想我对Windows如何处理这一问题一无所知,但MacOS是用于此目的的Unix可能是错误的(:LD_LIBRARY_PATH和rpath。
显然,遇到bug总是有可能的,在某些情况下需要小心。因此,这里有一些相关的链接和详细信息。
与ABI相关的GCC编译器选项。与ABI相关的标准库文档。
关于在C++11库ABI上的使用。C++11对一些类型(尤其是std::string
(提出了额外的要求,这阻止了GCC为这些类型保留其旧的ABI。因此,在GCC 5中引入了一个新的ABI,如果你想与前一个兼容,你必须注意。(注意,即使GCC版本5及更高版本,分销商有时也会强制使用旧的ABI(
较旧的相关SO问题