如何交叉编译程序:以freetype为例

news2024/11/25 6:30:15

【记录所学】
本博客为学习Linux开发时的笔记。主要记录如何交叉编译程序。

内容会首先介绍程序运行的一些基础知识,其次介绍常见错误的解决方法,然后介绍交叉编译程序的万能命令,最后以一个实际例子介绍如何交叉编译程序

简要说明,使用的开发板为:IMX6ULL
使用的是基于buildroot的交叉编译工具链,前缀为arm-buildroot-linux-gnueabihf-

1. 程序运行的一些基础知识

  1. 编译程序时去哪找头文件?
    (1)系统目录:就是交叉编译工具链里的某个include目录;
    (2)也可以自己指定:编译时用-I dir选项指定。

  2. 链接时去哪找库文件?
    (1)系统目录:就是交叉编译工具链里的某个lib目录;
    (2)也可以自己指定:链接时用 -L dir选项指定。

  3. 运行时去哪找库文件?
    (1)系统目录:就是板子上的/lib、/usr/lib目录;
    (2)也可以自己指定:运行程序用环境变量LD_LIBRARY_PATH指定。

  4. 运行时不需要头文件,所以头文件不用放到板子上

2. 常见错误的解决方法

2.1 头文件问题

编译时找不到头文件。在程序中这样包含头文件:#include <xxx.h>。对于尖括号里的头文件,去哪里找它?
(1)系统目录:就是交叉编译工具链里的某个include目录;
(2)也可以自己指定:编译时用-I dir选项指定。

怎么确定“系统目录”?执行下面命令确定目录:

echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH

你需要在头文件目录中确定有没有这个文件,或是自己指定头文件目录。

2.2 库文件问题

链接程序时如果有这样的提示:undefined reference to xxx,它表示xxx函数未定义。
那么解决方法有两种:
(1)去写出这个函数;
(2)或是使用库函数,那需要在链接时指定库

怎么指定库?

比如,想链接libabc.so,那链接时加上:-labc

库在哪里?

(1)系统目录:就是交叉编译工具链里的某个lib目录
(2)也可以自己指定:链接时用-L dir选项指定

怎么确定“系统目录”?执行下面命令确定目录:

echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH),你编译出库文件时,可以把它放入系统库目录。

2.3 运行问题

在板子上运行程序。

运行程序时找不到库,错误如下:

error while loading shared libraries: libxxx.so: 
cannot open shared object file: No such file or directory

找不到库,库在哪?

(1)系统目录:就是板子上的/lib、/usr/lib目录
(2)也可以自己指定:
运行程序用环境变量LD_LIBRARY_PATH指定,执行以下的命令:

export  LD_LIBRARY_PATH=/xxx_dir  ;  ./test
或
LD_LIBRARY_PATH=/xxx_dir   ./test

3. 交叉编译程序的万能命令

如果交叉编辑工具链的前缀是arm-buildroot-linux-gnueabihf-,比如arm-buildroot-linux-gnueabihf-gcc,交叉编译开源软件时,如果它里面有configure,万能命令如下:

./configure  --host=arm-buildroot-linux-gnueabihf   --prefix=$PWD/tmp
make
make install

就可以在当前目录的tmp目录下看见bin, lib, include等目录,里面存有可执行程序、库、头文件。

注意: 万能命令的前提是:开源软件中有configure。根据不同的交叉工具链,万能命令中的host有所不同。

(1)把头文件、库文件放到工具链目录里
如果你编译的是一个库,请把得到的头文件、库文件放入工具链的include、lib目录里。别的程序要使用这些头文件、库时,会很方便。

工具链里可能有多个include、lib目录,放到哪里去?

执行下面命令来确定目录:

echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH)。把头文件、库文件放到任一个目录下即可。

(2)把库文件放到板子上的/lib/usr/lib目录里
程序在板子上运行时,需要用到板子上/lib/usr/lib下的库文件;
程序运行时不需要头文件。

4. 交叉编译实例:交叉编译freetype

IMX6ULL交叉编译freetype
Freetype是开源的字体引擎库,它提供统一的接口来访问多种字体格式文件,从而实现矢量字体显示。我们只需要移植这个字体引擎,调用对应的API接口,提供字体文件,就可以让freetype库帮我们取出关键点、实现闭合曲线,填充颜色,达到显示矢量字体的目的。

freetype依赖于libpnglibpng又依赖于zlib,所以我们应该:先编译安装zlib,再编译安装libpng,最后编译安装freetype

但是,有些工具链里有zlib, 那就不用编译安装zlib,比如STM32MP157

对于IMX6ULL,由于版本原因,使用过两套工具链:精简版和完善版。对于精简版,里面没有zlib,需要先编译安装zlib。对于完善版,里面有zlib。可以跳过zlib安装。

下面将分别详细介绍IMX6ULL开发板的两套工具链编译freetype的过程。

4.1 精简版

精简版交叉编译工具链的环境配置如下:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

可以在终端直接执行环境配置命令,但是重启终端,还要重新执行命令。所以可以将上述命令添加到系统的bashrc中,使命令永久有效。
确定头文件路径命令:

echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -

可以确定头文件的系统目录为:

/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include

库文件的系统目录为:

/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/

4.1.1 交叉编译、安装zlib

libpng依赖于zlib,所以需要先编译、安装zlib。命令如下:

tar xzf zlib-1.2.11.tar.gz
cd zlib-1.2.11/

export CC=arm-linux-gnueabihf-gcc
./configure --prefix=$PWD/tmp

make
make install

cd tmp/
#将编译好的头文件放到工具链的头文件目录中(之前确定的)
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
#将编译好的库文件放到工具链的库文件目录中(之前确定的)
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/

如果在4.1.2中交叉编译、安装libpng时提示错误:configure: error: ZLib not installed,则按照解决安装libpng的时候出现configure: error: ZLib not installed的问题即可解决。

4.1.2 交叉编译、安装libpng

freetype依赖于libpng,所以需要先编译、安装libpng。命令如下:

tar xJf libpng-1.6.37.tar.xz
cd libpng-1.6.37
# 交叉编译程序的万能命令
./configure --host=arm-linux-gnueabihf --prefix=$PWD/tmp
make
make install

cd tmp/
#将编译好的头文件放到工具链的头文件目录中(之前确定的)
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
#将编译好的库文件放到工具链的库文件目录中(之前确定的)
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/

4.1.3 交叉编译、安装freetype

命令如下:

tar  xJf  freetype-2.10.2.tar.xz
cd  freetype-2.10.2
# 交叉编译程序的万能命令
./configure  --host=arm-linux-gnueabihf   --prefix=$PWD/tmp
make
make install

cd tmp/
#将编译好的头文件放到工具链的头文件目录中(之前确定的)
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
#将编译好的库文件放到工具链的库文件目录中(之前确定的)
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/

4.2 完善版

本文所使用的IMX6ULL开发板的交叉工具链是完善版的。
精简版交叉编译工具链的环境配置如下:

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

如下图确定头文件和库文件路径。
在这里插入图片描述
可以确定头文件的系统目录为:

/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include

库文件的系统目录为:

/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/

其实这两个路径不是唯一的,可以选择图片中的其他路径。

4.2.1 交叉编译、安装libpng

命令如下:

tar xJf libpng-1.6.37.tar.xz
cd libpng-1.6.37
# 交叉编译程序的万能命令
./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp
make
make install

cd tmp/
#将编译好的头文件放到工具链的头文件目录中(之前确定的)
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
#将编译好的库文件放到工具链的库文件目录中(之前确定的)
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/

4.2.2 交叉编译、安装freetype

命令如下:

tar  xJf  freetype-2.10.2.tar.xz
cd  freetype-2.10.2
# 交叉编译程序的万能命令
./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp
make
make install

cd tmp/
#将编译好的头文件放到工具链的头文件目录中(之前确定的)
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
#将编译好的库文件放到工具链的库文件目录中(之前确定的)
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/

写在最后,一些心得:

交叉编译程序与本地编译程序的区别:

本地编译开源软件使用makemake install之后,相关的头文件和依赖文件会被加载到本机的/usr/include 以及 lib/usr/lib/,之后其他程序需要使用时就会去这些路径中查找。

而交叉编译不能这样,因为交叉编译程序后得到的头文件和依赖文件不是给本机使用的。所以需要将得到的头文件和依赖文件放到交叉工具链的头文件目录和库文件目录!!!之后交叉编译自己的程序需要相关的头文件和库文件会去交叉工具链的头文件和库文件目录查找。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用篇丨链路追踪(Tracing)很简单:链路实时分析、监控与告警

作者&#xff1a;涯海 前文回顾&#xff1a; 基础篇&#xff5c;链路追踪&#xff08;Tracing&#xff09;其实很简单 使用篇&#xff5c;链路追踪&#xff08;Tracing&#xff09;其实很简单&#xff1a;请求轨迹回溯与多维链路筛选 在前面文章里面&#xff0c;我们介绍了…

快排非递归 归并排序

递归深度太深会栈溢出 程序是对的&#xff0c;但是递归个10000层就是栈溢出 int fun(int n) {if (n < 1){return n;}return fun(n - 1) n; }所以需要非递归来搞快排和归并&#xff0c;在效率方面没什么影响&#xff0c;只是解决递归深度太深的栈溢出问题 有的能直接改&am…

2023年Android开发现状~

随着Android 开发行业的快速发展&#xff0c;市场需求也在不断提升&#xff0c;导致低端Android 开发市场就业大环境不好、行业趋势下滑&#xff0c;使得不少初中级的Android开发开始失业&#xff0c;找不到工作。 为什么这么说&#xff1f; 现在不像2012年——2018年的这段期…

性能调优通用逻辑

调优准备 定目标&#xff1a;根据线上预估访问量评估单场景QPS及混合场景QPS&#xff0c;和对应的RT值 环境区分&#xff1a; 测试环境单机压测进行链路问题排查问题&#xff0c;通常需要把单机打到CPU到100%&#xff0c;如果CPU到不了100%且请求已经各种超时或RT高于目标值…

Voting_Averaging算法预测银行客户流失率

Voting_Averaging算法预测银行客户流失率 描述 为了防止银行的客户流失&#xff0c;通过数据分析&#xff0c;识别并可视化哪些因素导致了客户流失&#xff0c;并通过建立一个预测模型&#xff0c;识别客户是否会流失&#xff0c;流失的概率有多大。以便银行的客户服务部门更…

【大型互联网应用轻量级架构实战の一】轻量级架构概述

1、轻量级架构概述 1.1.1、前言 当下&#xff0c;互联网应用呈高速发展的趋势&#xff0c;要想不被市场淘汰&#xff0c;就必须与时间赛跑&#xff0c;故而&#xff0c;快 就成了所有互联网公司产品的特征&#xff0c;只有率先推出产品&#xff0c;才能获取主动权。 1.1.2、…

大模型时代下的paper生存= =

第一类&#xff1a;PEFT类论文 &#xff08;我还挺喜欢的&#xff0c;不知道自己什么时候可以搞出这种工作 &#xff08;为什么中英文穿插&#xff0c;利于自己写论文&#xff1a;&#xff09; COMPOSITIONAL P ROMPT T UNING WITH M OTIONC UES FOR O PEN - VOCABULARY V ID…

构建数字时代下的必要防线 消除医疗行业数据安全建设“盲区”

4月7日&#xff0c;由厦门市卫生健康信息学会和厦门大学附属第一医院、厦门服云信息科技有限公司举办的医疗数据安全学术研讨会顺利开展。 作为国内云原生安全领导厂商&#xff0c;安全狗除了协助举办此次活动&#xff0c;还以数据安全治理专家的身份参与演讲分享。 厦门服云…

全网最详细,Jmeter性能测试-性能进阶, 无界面命令运行CLI模式(六)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 如果使用jmeter.bat…

代码随想录算法训练营第四十一天-动态规划3|343. 整数拆分 ,96.不同的二叉搜索树

343整数拆分&#xff0c;有两种解法&#xff0c;一种是数学的方法&#xff0c;利用当f>4时&#xff0c;2*&#xff08;f - 2&#xff09;2f - 4 > f的性质&#xff0c;将所有的因子都拆成3&#xff0c;最后的余数再乘进去。另外一种是动态规划&#xff0c;把前面的数拆了…

算法---文件的最长绝对路径

题目 假设有一个同时存储文件和目录的文件系统。下图展示了文件系统的一个示例&#xff1a; 这里将 dir 作为根目录中的唯一目录。dir 包含两个子目录 subdir1 和 subdir2 。subdir1 包含文件 file1.ext 和子目录 subsubdir1&#xff1b;subdir2 包含子目录 subsubdir2&…

PHP快速入门11-文件操作,附写入文件、文件重命名等20个高频使用案例

文章目录前言一、文件操作介绍二、 20个文件操作的例子2.1 打开文件并写入数据2.2 读取文件中的一行数据2.3 读取文件中的一个字符2.4 读取整个文件内容2.5 向文件写入内容2.6 将整个文件读入一个数组中2.7 删除文件2.8 重命名文件2.9 复制文件2.10 判断是否为文件2.11 判断是否…

【致敬未来的攻城狮计划】RA2E1环境搭建点亮发光二极管

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯和 瑞萨MCU &#xff08;瑞萨电子 (Renesas Electronics Corporation) &#xff09; 联合发起的「 致敬未来的攻城狮计划 」的第 2 天&#xff0c;点击查看活动计划详情 &#xff01; 开发环境搭建 开…

React styled-components(三)—— 高级特性

styled-components 高级特性样式继承嵌套设置主题样式继承 新建 Demo.js 文件&#xff1a; import React, { Component } from react import styled from styled-components;const CustomStyle styled.divp { color: red;} const ContextBox styled(CustomStyle)width:…

Tableau-创建环状图:使用2个饼图

步骤 1&#xff1a;创建饼图 在“标记”下面&#xff0c;选择“饼图”标记类型。将分类拖到颜色。将任务总数拖到角度。再拖动一次任务总数&#xff0c;放到标签。根据需要调整饼图大小。 步骤 2&#xff1a;切换到双轴图表 右键点击任意一个字段&#xff0c;创建-->计算…

3年功能测试无情被裁,3个月学习自动化测试重新开始........

前言 不知不觉在软件测试行业工作了3年之久&#xff0c;虽然说我是主做的功能测试&#xff0c;但是我也一直是兢兢业业的呀&#xff0c;不曾想去年7月份无情被辞的消息让我感到一阵沉重。我曾经一直坚信自己的技能和经验足以支撑我在这个领域的未来&#xff0c;但现实却告诉我&…

考研数据结构——表达式的转换用栈实现表达式的概述

一、用表达式实现中缀表达式转后缀表达式 把括号里的符号移到括号外 二、用栈实现中缀表达式转后缀表达式 1、遇到字母写下来 2、遇到符号加入栈中 3、遇到成对括号才出栈 4、当前读取运算符要小于等于栈顶运算符优先级则出栈 从左向右扫描 三、表达式方法实现中缀表达式转…

Shader Graph9-世界空间、物体空间、相机空间、切线空间

一、World Space世界空间 在下用的Blender软件&#xff0c;新建了一个平面&#xff0c;中间的黄色小圆点表示的世界空间的原点&#xff0c;在世界空间的物体的位置&#xff0c;都是相对于这个原点来说的&#xff0c;红色箭头表示x轴&#xff0c;绿色箭头表示y轴&#xff0c;蓝…

算法 二叉树2 || 层序遍历 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111 二叉树的最小深度 222.完全二叉树的节点个数

102 二叉树的层序遍历 队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历&#xff0c;只不过我们应用在二叉树上。 迭代法&#xff1a; /*** Definition for …

springboot和vue写个小项目

遵循“约定优于配置”的原则&#xff0c;只需要很少的配置或使用默认的配置。 能够使用内嵌的Tomcat、Jetty服务器&#xff0c;不需要部署war文件。 提供定制化的启动器Starters,简化Maveni配置&#xff0c;开箱即用。 纯&#xff09;java配置&#xff0c;没有代码生成&#xf…