CN113849181A - 交叉编译工具链构建方法、装置、电子设备及存储介质 - Google Patents
交叉编译工具链构建方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN113849181A CN113849181A CN202010599357.1A CN202010599357A CN113849181A CN 113849181 A CN113849181 A CN 113849181A CN 202010599357 A CN202010599357 A CN 202010599357A CN 113849181 A CN113849181 A CN 113849181A
- Authority
- CN
- China
- Prior art keywords
- target platform
- cross
- file
- compiling
- corresponding target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
Abstract
本发明实施例提供一种交叉编译工具链构建方法、装置、电子设备及存储介质,方法包括:创建各目标平台的文件目录;获取各目标平台适用的交叉编译工具的源代码和第三方库文件;获取各目标平台适用的系统核心文件;根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。由此可见,本发明实施例提出了一种通用型的交叉编译工具链构建方法,构建得到的交叉编译工具链可以支持各种不同平台架构的交叉编译工作。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种交叉编译工具链构建方法、装置、电子设备及存储介质。
背景技术
在一种计算机环境中运行编译程序,把计算机目标代码编译成可以在另外一种计算机环境下运行的程序,这个编译过程为交叉编译,其使用的编译程序就是交叉编译工具链。
目前进行交叉编译的主要原因在于以下几方面:
①Speed:目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能。
②Capability:整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间。
③Availability:即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得。
④Flexibility:一个完整的Linux编译环境需要很多支持包,交叉编译使得不需要花时间将各种支持包移植到目标板上。
需要说明的是,进行交叉编译的必须工具就是交叉编译工具链,目前网络上能获取到一些针对特定CPU平台编译好的交叉工具链,如单独针对mips平台的交叉工具链,单独针对x86平台的交叉工具链。然而这些从网络上获取的交叉工具链存在以下问题:
1、只存在针对特定平台的交叉工具链,因此无法满足实际项目需求;2、对于其编译特效不清楚、无法随时升级、难以追加补丁等。
发明内容
针对现有技术中的问题,本发明实施例提供一种交叉编译工具链构建方法、装置、电子设备及存储介质。
具体地,本发明实施例提供了以下技术方案:
第一方面,本发明实施例提供了一种交叉编译工具链构建方法,包括:
创建各目标平台的文件目录;
获取各目标平台适用的交叉编译工具的源代码和第三方库文件;
获取各目标平台适用的系统核心文件;
根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
进一步地,每个目标平台的文件目录下包含有工具文件夹、安装目录文件夹和系统核心文件文件夹;
所述工具文件夹,用于存储适用于相应目标平台的交叉编译工具的源代码以及第三方库文件;
所述安装目录文件夹,用于存储所述工具文件夹中的源代码编译完成后的安装文件以及所述第三方库文件的安装文件;
所述系统核心文件文件夹,用于存储适用于相应目标平台的系统核心文件。
进一步地,所述交叉编译工具包括:gcc和binutils;
相应地,获取各目标平台适用的交叉编译工具的源代码和第三方库文件,包括:
确定各目标平台适用的gcc的源代码和第三方库文件;
确定各目标平台适用的binutils的源代码和第三方库文件。
进一步地,根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,包括:
根据各目标平台适用的gcc的源代码和第三方库文件,将gcc编译并安装至相应目标平台的文件目录下;
根据各目标平台适用的binutils的源代码和第三方库文件,将binutils编译并安装至相应目标平台的文件目录下。
进一步地,根据各目标平台适用的gcc的源代码和第三方库文件,将gcc编译并安装至相应目标平台的文件目录下,包括:
确定各目标平台适用的gcc的安装参数--prefix--target的取值;
根据第三方库文件以及安装参数--prefix--target的取值,将gcc编译并安装至相应目标平台的文件目录下;
相应地,根据各目标平台适用的binutils的源代码和第三方库文件,将binutils编译并安装至相应目标平台的文件目录下,包括:
确定各目标平台适用的binutils的安装参数--prefix--target的取值;
根据第三方库文件以及安装参数--prefix--target的取值,将binutils编译并安装至相应目标平台的文件目录下。
进一步地,在根据第三方库文件以及安装参数--prefix--target的取值,将gcc编译并安装至相应目标平台的文件目录时,根据是否需要c和c++功能确定是否添加-enable-languages=c,c++。
进一步地,所述系统核心文件包括lib、lib64、lib32、/usr/include、/usr/lib、/usr/lib32、/usr/lib64和/usr/libexec中的一种或多种;
相应地,将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,包括:
将获取的适用于相应目标平台的系统核心文件打包拷贝解压至相应目标平台的文件目录下,以保证系统核心文件的软链属性,
其中,当系统核心文件的软链链接的文件与目标平台所在的宿主机上的文件具有相同的访问路径时,修改系统核心文件的软链属性,以使得系统核心文件的软链链接的文件与目标平台所在的宿主机上的文件不再具有相同的访问路径。
进一步地,所述交叉编译工具链构建方法,还包括:
当待交叉编译至相应目标平台的目标代码的libc.so中记录有ld脚本时,将ld脚本指定的ld.so依赖的libc路径修改为目标平台适用的路径;
当待交叉编译至相应目标平台的目标代码的libpthread.so中记录有ld脚本时,将ld脚本指定的ld.so依赖的libpthread路径修改为目标平台适用的路径。
进一步地,所述交叉编译工具链构建方法,还包括:
根据相应目标平台的文件目录下存储的系统核心文件以及编译并安装好的交叉编译工具,将待交叉编译至相应目标平台的目标代码,交叉编译为适用于相应目标平台的代码。
第二方面,本发明实施例还提供了一种交叉编译工具链构建装置,包括:
创建模块,用于创建各目标平台的文件目录;
第一获取模块,用于获取各目标平台适用的交叉编译工具的源代码和第三方库文件;
第二获取模块,用于获取各目标平台适用的系统核心文件;
构建模块,用于根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
第三方面,本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述交叉编译工具链构建方法的步骤。
第四方面,本发明实施例还提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所述交叉编译工具链构建方法的步骤。
第五方面,本发明实施例还提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现如第一方面所述交叉编译工具链构建方法的步骤。
由上面技术方案可知,本发明实施例提供的交叉编译工具链构建方法、装置、电子设备及存储介质,通过创建各目标平台的文件目录,并将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链,由此可见,本发明实施例提出了一种通用型的交叉编译工具链构建方法,该方法可以定制符合项目实际需求的交叉编译工具链,例如可以支持arm、mips、x86、alpha等各种不同平台架构的交叉编译工作,而不再依赖网络上未知特效、无法随时升级、难以追加补丁等等不符合实际项目需求的交叉编译工具链。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一实施例提供的交叉编译工具链构建方法的流程图;
图2为本发明一实施例提供的交叉编译工具链构建装置的结构示意图;
图3为本发明一实施例提供的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在一种计算机环境中运行编译程序,把计算机目标代码编译成可以在另外一种计算机环境下运行的程序,这个编译过程为交叉编译,其使用的编译程序就是交叉编译工具链。由此可见,进行交叉编译的必须工具就是交叉编译工具链,目前网络上能获取到一些针对特定CPU平台编译好的交叉工具链,当交叉编译工具链无法满足实际项目需求时,构建通用型的交叉编译工具链成为了必须的工作。针对这种情况,本发明提出了一种通用型的交叉编译工具链构建方法,该方法可以定制符合项目实际需求的交叉编译工具链,以支持arm、mips、x86、alpha等不同平台架构的交叉编译工作,而不再依赖网络上未知特效、无法随时升级、难以追加补丁等等不符合实际项目需求的交叉编译工具链。下面将通过具体实施例对本发明提供的交叉编译工具链构建方法进行详细解释和说明。
图1示出了本发明实施例提供的交叉编译工具链构建方法的流程图。如图1所示,本发明实施例提供的交叉编译工具链构建方法包括如下步骤:
步骤101:创建各目标平台的文件目录;
在本步骤中,可以创建/root/cross_compilation目录,用于管理所有目标平台的交叉编译工具链,然后在该/root/cross_compilation目录下创建与各目标平台分别对应的文件目录,例如,可以创建与各目标平台(例如arm、mips、x86、alpha)分别对应的文件目录:arm文件夹、mips文件夹、x86文件夹、alpha文件夹,这些文件夹分别用于存储相应目标平台适用的交叉编译工具的源代码和第三方库文件。
例如,在/root/cross_compilation下,创建与arm平台对应的文件目录:/root/cross-compilation/arm,进一步地,在arm文件夹下,可以进一步依次创建各个文件,分别用于存储arm平台适用的交叉编译工具的源代码和第三方库文件等文件。
步骤102:获取各目标平台适用的交叉编译工具的源代码和第三方库文件;
在本步骤中,交叉编译工具可以包括gcc和binutils,因此,可以查看适用于各目标平台上的gcc版本和二进制工具binutils(ld|nm|strip等)版本,然后找到相应源码包下载(http://ftp.gnu.org/gnu/gcc,http://ftp.gnu.org/gnu/binutils)。此外,在下载适用于各目标平台的gcc和binutils后,需要将下载好的适用于各目标平台的交叉编译工具gcc和binutils分别安装至相应目标平台的文件目录下。
步骤103:获取各目标平台适用的系统核心文件;
在本步骤中,由于在进行交叉编译时需要用到目标平台的系统核心文件,因此这里需要先获取各目标平台适用的系统核心文件。
步骤104:根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
在本步骤中,在获取各目标平台适用的交叉编译工具的源代码和第三方库文件以及各目标平台适用的系统核心文件后,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
由上面技术方案可知,本实施例提供的交叉编译工具链构建方法,通过创建各目标平台的文件目录,并将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链,由此可见,本发明实施例提出了一种通用型的交叉编译工具链构建方法,该方法可以定制符合项目实际需求的交叉编译工具链,例如可以支持arm、mips、x86、alpha等各种不同平台架构的交叉编译工作,而不再依赖网络上未知特效、无法随时升级、难以追加补丁等等不符合实际项目需求的交叉编译工具链。
基于上述实施例的内容,在本实施例中,每个目标平台的文件目录下包含有工具文件夹、安装目录文件夹和系统核心文件文件夹;
所述工具文件夹,用于存储适用于相应目标平台的交叉编译工具的源代码以及第三方库文件;
所述安装目录文件夹,用于存储所述工具文件夹中的源代码编译完成后的安装文件以及所述第三方库文件的安装文件;
所述系统核心文件文件夹,用于存储适用于相应目标平台的系统核心文件。
在本实施例中,建立安装目录,方便后期交叉编译路径管理:
S1、创建/root/cross_compilation目录,用于管理所有目标平台的交叉编译;
S2、在此目录下,每个平台分别建属于此平台的文件目录,如arm平台,建立相应文件夹:/root/cross-compilation/arm;
S3、在此文件夹下,依次创建:cross|tools|sysroot|work_src,其中tools文件夹存放适用于相应目标平台的交叉编译工具的源代码以及第三方库文件;cross文件夹存放tools文件夹中的源代码编译完成后的安装文件以及所述第三方库文件的安装文件;sysroot存放适用于相应目标平台的系统核心文件;work_src存放准备交叉编译的代码。
在本实施例中,为不同的目标平台分别创建了对应的文件目录,因此便于对属于不同目标平台的交叉编译工具链进行管理。此外,在与每个目标平台对应的文件目录下进一步细分了至少四个文件夹cross|tools|sysroot|work_src,用于分别存放适用于相应目标平台的交叉编译工具的源代码以及第三方库文件、存放tools文件夹中的源代码编译完成后的安装文件以及所述第三方库文件的安装文件、存放适用于相应目标平台的系统核心文件、存放准备交叉编译的代码,从而使得交叉编译所需的文件分别存放在不同的文件夹内,因此,便于进行交叉编译过程的管理,使得能够顺利实现交叉编译,避免交叉编译过程出现异常。
基于上述实施例的内容,在本实施例中,所述交叉编译工具包括:gcc和binutils;
相应地,获取各目标平台适用的交叉编译工具的源代码和第三方库文件,包括:
确定各目标平台适用的gcc的源代码和第三方库文件;
确定各目标平台适用的binutils的源代码和第三方库文件。
在本实施例中,需要说明的是,gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是预处理和编译,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。一般来说,binutils与gcc是紧密相集成的,没有binutils,gcc一般不能正常工作的。因此,在本实施例中,需要将适用于相应目标平台的交叉编译工具gcc和binutils一并下载编译并安装至相应目标平台的文件目录下。
在本实施例中,将适用于相应目标平台的交叉编译工具gcc和binutils编译并安装至相应目标平台的文件目录下,以保证交叉编译工作的顺利进行。
基于上述实施例的内容,在本实施例中,根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,包括:
根据各目标平台适用的gcc的源代码和第三方库文件,将gcc编译并安装至相应目标平台的文件目录下;
根据各目标平台适用的binutils的源代码和第三方库文件,将binutils编译并安装至相应目标平台的文件目录下。
在本实施例中,安装之前可以先通过./configure--help查看下帮助文档看下注意事项和参数,安装参数只需使用--prefix--arget即可,其中target依据需交叉编译的目标平台来定,现使用的有:mipsel-linux|mips64el-linux|aarch64-linux,如:
①./configure--prefix=/root/cross-compilation/mipsel64/cross/--target=mips64el-linux&&make&&make install
②./configure--prefix=/root/cross-compilation/mipsel/cross/--target=mipsel-linux&&make&&make install
③./configure--prefix=/root/cross-compilation/aarch64/cross/--target=aarch64-linux&&make&&make install。
在本实施例中,给出了将交叉编译工具binutils编译并安装至相应目标平台的文件目录下的具体过程,通过该实施例,使得交叉编译工具binutils能够顺利安装至相应目标平台的文件目录下,同时保证安装好的binutils能够为交叉编译过程提供工具支持。
基于上述实施例的内容,在本实施例中,根据各目标平台适用的gcc的源代码和第三方库文件,将gcc编译并安装至相应目标平台的文件目录下,包括:
确定各目标平台适用的gcc的安装参数--prefix--target的取值;
根据第三方库文件以及安装参数--prefix--target的取值,将gcc编译并安装至相应目标平台的文件目录下;
相应地,根据各目标平台适用的binutils的源代码和第三方库文件,将binutils编译并安装至相应目标平台的文件目录下,包括:
确定各目标平台适用的binutils的安装参数--prefix--target的取值;
根据第三方库文件以及安装参数--prefix--target的取值,将binutils编译并安装至相应目标平台的文件目录下。
在本实施例中,安装交叉编译工具gcc的第三方库文件(也称依赖库),包括:
将适用于相应目标平台的交叉编译工具gcc解压文件目录下的contrib/download_prerequisites拷贝至上级目录并执行,以将gcc的依赖库下载、解压并软链;
或,
当适用于相应目标平台的交叉编译工具gcc的版本为没有download_prerequisites文件且不支持自动安装依赖库的gcc版本时,手动下载并安装依赖库,并在安装gcc时加入参数以指定依赖库的安装路径。
在本实施例中,对于一些旧版本的gcc而言,因其没有download_prerequisites文件且不支持自动安装依赖库,故这些依赖的mpc等库均需手动下载并安装。其安装次序依次为:gmp、mpfr、mpc、isl、cloog,并在安装gcc时需加入参数指定依赖库的安装路径,示例如下:
./configure--prefix=/root/cross_compilation/aarch64/cross\
--target=aarch64-linux\
--with-gmp=/root/cross_compilation/aarch64/cross\
--with-mpfr=/root/cross_compilation/aarch64/cross\
--with-mpc=/root/cross_compilation/aarch64/cross\
--with-isl=/root/cross_compilation/aarch64/cross\
--with-cloog=/root/cross_compilation/aarch64/cross\
--enable-languages=c,c++\
--disable-multilib&&make all-gcc&&make install-gcc
在安装binutils和gcc的过程中可能会遇到各种问题,具体问题可以详见config.log等文件,并根据具体问题的问题类型进行分析。
由此可见,在本实施例中,对于一些版本较低的gcc,需要手动下载和安装依赖库,以保证安装好的gcc能够为交叉编译过程提供正常的工具支持。
此外,在本实施例中,在将交叉编译工具gcc安装至相应目标平台的文件目录下之前,所述方法还包括:
判断是否需要c和c++功能,若是,则添加-enable-languages=c,c++参数;
判断是否不需要生成编译为其他目标平台可执行代码的交叉编译工具链,若是,则添加-disable-multilib参数;其中,其他目标平台指除所述相应目标平台以外的所有目标平台;
相应地,根据gcc的依赖库和gcc的安装参数,将交叉编译工具gcc安装至相应目标平台的文件目录下,包括:
根据gcc的依赖库、gcc的安装参数以及添加的参数,将交叉编译工具gcc安装至相应目标平台的文件目录下。
在本实施例中,需要建立初始静态的gcc编译工具,由于gcc的安装又依赖于第三方mpfr、mpc、gmp、isl、cloog等库,所以一般的安装方法可以如下:
将gcc解压文件目录下的contrib/download_prerequisites拷贝至上级目录并执行,此步骤会将此版本的gcc依赖的库下载、解压并软链好;
依据不同的平台选择不同的target参数,具体可以参见./configure-help查看相应参数,同binutils中target参数;
当只需要c和c++功能,gcc在源码编译时为节省时间,需添加-enable-languages=c,c++参数;
当不需要生成编译为其他平台可执行代码的交叉编译器,添加上-disable-multilib参数,所以,gcc的一般安装流程如下示例:
①./configure--prefix=/root/cross-compilation/mipsel64/cross/--target=mips64el-linux--enable-languages=c,c++--disable-multilib&&makeall-gcc&&make install-gcc
②./configure--prefix=/root/cross-compilation/mipsel/cross/--target=mipsel-linux--enable-languages=c,c++--disable-multilib&&makeall-gcc&&makeinstall-gcc
③./configure--prefix=/root/cross-compilation/aarch64/cross/--target=aarch64-linux--enable-languages=c,c++--disable-multilib&&makeall-gcc&&makeinstall-gcc。
在本实施例中,给出了将交叉编译工具gcc安装至相应目标平台的文件目录下的具体过程,通过该实施例,使得交叉编译工具gcc能够顺利安装至相应目标平台的文件目录下,同时保证安装好的gcc能够为交叉编译过程提供工具支持。
基于上述实施例的内容,在本实施例中,将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,包括:
将获取的适用于相应目标平台的系统核心文件打包拷贝解压至相应目标平台的文件目录下,以保证系统核心文件的软链属性,
其中,当系统核心文件的软链链接的文件与目标平台所在的宿主机上的文件具有相同的访问路径时,修改系统核心文件的软链属性,以使得系统核心文件的软链链接的文件与目标平台所在的宿主机上的文件不再具有相同的访问路径。
在本实施例中,所述系统核心文件包括lib、lib64、lib32、/usr/include、/usr/lib、/usr/lib32、/usr/lib64和/usr/libexec中的一种或多种;
在本实施例中,准备交叉编译所依赖的系统核心文件。具体地址,将系统核心文件打包拷贝至sysroot目录下:一般所需打包的文件有/lib|/lib64|/lib32|/usr/include|/usr/lib|/usr/lib32|/usr/lib64|/usr/libexec等;为保证其中的软链属性,在原平台中打包后直接解压到目标平台宿主机相应文件的sysroot目录下。此外,需要注意的是,也正是软链的属性有可能会导致拷贝至宿主机后出现软连接的失效和错误的问题,比如有软链链接的是原系统中的/usr/lib/a这个文件,但是宿主机系统中恰好有/usr/lib/a这个文件,就会导致软链其实是失效的,这会在编译时带来各种问题,所以,针对具体情况,需要修复相应软链到正确的位置上,使得系统核心文件的软链链接的文件与宿主机系统上的文件不再具有相同的访问路径。
在本实施例中,将获取的系统核心文件存储至相应目标平台的文件目录下,由于这些核心文件是交叉编译所依赖的核心文件,因此,将这些核心文件存储至相应目标平台的文件目录下,可以使得后续根据相应目标平台的文件目录下存储的系统核心文件以及交叉编译工具,将待交叉编译至相应目标平台的目标代码,交叉编译为适用于相应目标平台的代码,从而可以完成交叉编译工作。
基于上述实施例的内容,在本实施例中,交叉编译工具链构建方法,还包括:
当待交叉编译至相应目标平台的目标代码的libc.so中记录有ld脚本时,将ld脚本指定的ld.so依赖的libc路径修改为目标平台适用的路径;
当待交叉编译至相应目标平台的目标代码的libpthread.so中记录有ld脚本时,将ld脚本指定的ld.so依赖的libpthread路径修改为目标平台适用的路径。
在本实施例中,需要说明的是,将ld脚本指定的ld.so依赖的libpthread路径修改为目标平台适用的路径是指:将旧路径替换为目标平台同名文件所处的实际路径。举例来说,libpthread.so旧路径为/usr/bin/libpthread.so,arm64平台中libpthread.so的实际位置在/home/arm64/sysroot/usr/lib/libpthread.so,为此,需要将旧路径替换为arm64平台中的实际路径。
在本实施例中,需要注意的地方是:原系统的libc.so中一般会记录有一段ld的脚本,这个脚本指定了ld.so依赖的libc的路径,优先libc.so其次libc_nonshared.a;这个路径是固定的,所以需要提前进行修改到对应的合适路径,避免编译出现错误;而类似的还有libpthread.so,里边仍然记录有一段ld的脚本,这个脚本指定了ld.so依赖的libpthread的路径,优先libpthread.so其次libpthread_nonshared.a;至此,定制交叉工具链构建完毕。
在本实施例中,通过修改ld脚本指定的ld.so依赖的libc路径和ld脚本指定的ld.so依赖的libpthread路径,从而保证交叉编译的正常进行。
基于上述实施例的内容,在本实施例中,交叉编译工具链构建方法,还包括:
根据相应目标平台的文件目录下存储的系统核心文件以及交叉编译工具,将待交叉编译至相应目标平台的目标代码,交叉编译为适用于相应目标平台的代码。
在本实施例中,在构建得到交叉编译工具链后,利用构建得到的交叉编译工具链,根据相应目标平台(符合项目实际需求的目标平台)的文件目录下存储的系统核心文件以及交叉编译工具,将待交叉编译至相应目标平台的目标代码,交叉编译为适用于相应目标平台的代码,从而可以完成符合项目实际需求的交叉编译工作。
图2示出了本发明实施例提供的交叉编译工具链构建装置的结构示意图。如图2所示,本实施例提供的交叉编译工具链构建装置,包括:创建模块21、第一获取模块22、第二获取模块23和构建模块24,其中:
创建模块21,用于创建各目标平台的文件目录;
第一获取模块22,用于获取各目标平台适用的交叉编译工具的源代码和第三方库文件;
第二获取模块23,用于获取各目标平台适用的系统核心文件;
构建模块24,用于根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
由于本发明实施例提供的交叉编译工具链构建装置,可以用于执行上述实施例所述的交叉编译工具链构建方法,其工作原理和有益效果类似,故此处不再详述,具体内容可参见上述实施例的介绍。
在本实施例中,需要说明的是,本发明实施例的装置中的各个模块可以集成于一体,也可以分离部署。上述模块可以合并为一个模块,也可以进一步拆分成多个子模块。
基于相同的发明构思,本发明又一实施例提供了一种电子设备,参见图3,所述电子设备具体包括如下内容:处理器301、存储器302、通信接口303和通信总线304;
其中,所述处理器301、存储器302、通信接口303通过所述通信总线304完成相互间的通信;
所述处理器301用于调用所述存储器302中的计算机程序,所述处理器执行所述计算机程序时实现上述交叉编译工具链构建方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:创建各目标平台的文件目录;获取各目标平台适用的交叉编译工具的源代码和第三方库文件;获取各目标平台适用的系统核心文件;根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
基于相同的发明构思,本发明又一实施例提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述交叉编译工具链构建方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:创建各目标平台的文件目录;获取各目标平台适用的交叉编译工具的源代码和第三方库文件;获取各目标平台适用的系统核心文件;根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
基于相同的发明构思,本发明又一实施例提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现上述关联应用启动控制方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:创建各目标平台的文件目录;获取各目标平台适用的交叉编译工具的源代码和第三方库文件;获取各目标平台适用的系统核心文件;根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的交叉编译工具链构建方法。
此外,在本发明中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
此外,在本发明中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (13)
1.一种交叉编译工具链构建方法,其特征在于,包括:
创建各目标平台的文件目录;
获取各目标平台适用的交叉编译工具的源代码和第三方库文件;
获取各目标平台适用的系统核心文件;
根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
2.根据权利要求1所述的交叉编译工具链构建方法,其特征在于,每个目标平台的文件目录下包含有工具文件夹、安装目录文件夹和系统核心文件文件夹;
所述工具文件夹,用于存储适用于相应目标平台的交叉编译工具的源代码以及第三方库文件;
所述安装目录文件夹,用于存储所述工具文件夹中的源代码编译完成后的安装文件以及所述第三方库文件的安装文件;
所述系统核心文件文件夹,用于存储适用于相应目标平台的系统核心文件。
3.根据权利要求1所述的交叉编译工具链构建方法,其特征在于,所述交叉编译工具包括:gcc和binutils;
相应地,获取各目标平台适用的交叉编译工具的源代码和第三方库文件,包括:
确定各目标平台适用的gcc的源代码和第三方库文件;
确定各目标平台适用的binutils的源代码和第三方库文件。
4.根据权利要求3所述的交叉编译工具链构建方法,其特征在于,根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,包括:
根据各目标平台适用的gcc的源代码和第三方库文件,将gcc编译并安装至相应目标平台的文件目录下;
根据各目标平台适用的binutils的源代码和第三方库文件,将binutils编译并安装至相应目标平台的文件目录下。
5.根据权利要求4所述的交叉编译工具链构建方法,其特征在于,根据各目标平台适用的gcc的源代码和第三方库文件,将gcc编译并安装至相应目标平台的文件目录下,包括:
确定各目标平台适用的gcc的安装参数--prefix--target的取值;
根据第三方库文件以及安装参数--prefix--target的取值,将gcc编译并安装至相应目标平台的文件目录下;
相应地,根据各目标平台适用的binutils的源代码和第三方库文件,将binutils编译并安装至相应目标平台的文件目录下,包括:
确定各目标平台适用的binutils的安装参数--prefix--target的取值;
根据第三方库文件以及安装参数--prefix--target的取值,将binutils编译并安装至相应目标平台的文件目录下。
6.根据权利要求5所述的交叉编译工具链构建方法,其特征在于,在根据第三方库文件以及安装参数--prefix--target的取值,将gcc编译并安装至相应目标平台的文件目录时,根据是否需要c和c++功能确定是否添加-enable-languages=c,c++。
7.根据权利要求1所述的交叉编译工具链构建方法,其特征在于,所述系统核心文件包括lib、lib64、lib32、/usr/include、/usr/lib、/usr/lib32、/usr/lib64和/usr/libexec中的一种或多种;
相应地,将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,包括:
将获取的适用于相应目标平台的系统核心文件打包拷贝解压至相应目标平台的文件目录下,以保证系统核心文件的软链属性,
其中,当系统核心文件的软链链接的文件与目标平台所在的宿主机上的文件具有相同的访问路径时,修改系统核心文件的软链属性,以使得系统核心文件的软链链接的文件与目标平台所在的宿主机上的文件不再具有相同的访问路径。
8.根据权利要求7所述的交叉编译工具链构建方法,其特征在于,还包括:
当待交叉编译至相应目标平台的目标代码的libc.so中记录有ld脚本时,将ld脚本指定的ld.so依赖的libc路径修改为目标平台适用的路径;
当待交叉编译至相应目标平台的目标代码的libpthread.so中记录有ld脚本时,将ld脚本指定的ld.so依赖的libpthread路径修改为目标平台适用的路径。
9.根据权利要求1~8任一项所述的交叉编译工具链构建方法,其特征在于,还包括:
根据相应目标平台的文件目录下存储的系统核心文件以及编译并安装好的交叉编译工具,将待交叉编译至相应目标平台的目标代码,交叉编译为适用于相应目标平台的代码。
10.一种交叉编译工具链构建装置,其特征在于,包括:
创建模块,用于创建各目标平台的文件目录;
第一获取模块,用于获取各目标平台适用的交叉编译工具的源代码和第三方库文件;
第二获取模块,用于获取各目标平台适用的系统核心文件;
构建模块,用于根据各目标平台适用的交叉编译工具的源代码和第三方库文件,将适用于相应目标平台的交叉编译工具编译并安装至相应目标平台的文件目录下,并将获取的适用于相应目标平台的系统核心文件存储至相应目标平台的文件目录下,以构建适用于各目标平台的交叉编译工具链。
11.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1~9任一项所述交叉编译工具链构建方法的步骤。
12.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1~9任一项所述交叉编译工具链构建方法的步骤。
13.一种计算机程序产品,所计算机程序产品包括有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1~9任一项所述交叉编译工具链构建方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010599357.1A CN113849181A (zh) | 2020-06-28 | 2020-06-28 | 交叉编译工具链构建方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010599357.1A CN113849181A (zh) | 2020-06-28 | 2020-06-28 | 交叉编译工具链构建方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113849181A true CN113849181A (zh) | 2021-12-28 |
Family
ID=78972460
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010599357.1A Pending CN113849181A (zh) | 2020-06-28 | 2020-06-28 | 交叉编译工具链构建方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113849181A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117251166A (zh) * | 2023-08-25 | 2023-12-19 | 上海合芯数字科技有限公司 | 缩短op-build编译时间的编译方法、装置、终端及介质 |
-
2020
- 2020-06-28 CN CN202010599357.1A patent/CN113849181A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117251166A (zh) * | 2023-08-25 | 2023-12-19 | 上海合芯数字科技有限公司 | 缩短op-build编译时间的编译方法、装置、终端及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10114637B1 (en) | Automatically updating a shared project build platform | |
US10019256B2 (en) | Systems and methods for incremental software development | |
US8745585B2 (en) | Meta-data for single development test environment | |
US8561023B2 (en) | Software change management extension for uniformly handling artifacts with relaxed contraints | |
US10579966B1 (en) | Adapting a shared project build platform to a developer plugin | |
US8261247B2 (en) | Method of modifying code of a running computer program based on symbol values discovered from comparison of running code to corresponding object code | |
CN109491695A (zh) | 一种集成安卓应用的增量更新方法 | |
EP0707264A2 (en) | System and method for determining whether a software package conforms to packaging rules and requirements | |
JPH09152961A (ja) | ソフトウエアプログラムにバージョン設定情報を付す方法および装置 | |
EP1771785A2 (en) | System and method for extraction and creation of application meta-information within a software application repository | |
US9542173B2 (en) | Dependency handling for software extensions | |
CN113342387A (zh) | 一种软件自动升级方法、更新客户端及更新服务器 | |
CN113849181A (zh) | 交叉编译工具链构建方法、装置、电子设备及存储介质 | |
US9760364B2 (en) | Checks for software extensions | |
CN110647349B (zh) | 一种实现iOS APP持续交付的方法 | |
CN110688140B (zh) | 一种代码管理方法和终端 | |
CN111722875A (zh) | 一种申威平台快速移植编译开源程序的方法 | |
CN115794214A (zh) | 应用模块元数据管理方法、设备、存储介质及装置 | |
CN114089965A (zh) | 基于单体式代码仓库Monorepo的程序开发项目管理方法、装置 | |
CN110362320B (zh) | 一种应用开发平台的命令实现方法和装置 | |
CN111949268A (zh) | 项目编译方法、装置、电子设备及存储介质 | |
US9477447B1 (en) | Semantic representations of software extensions | |
CN113467803B (zh) | 应用程序的修复方法以及相关装置、设备 | |
Team | Openembedded user manual | |
CN114237572B (zh) | 原生工程集成开发框架的方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |