網(wǎng)站開發(fā)公司加盟seo資料網(wǎng)
1、Freetype簡(jiǎn)介
FreeType是一個(gè)開源的字體渲染引擎,主要用于將字體文件轉(zhuǎn)換為位圖或矢量圖形,并在屏幕上渲染出高質(zhì)量的字體。它提供了一組API,使開發(fā)者能夠在自己的應(yīng)用程序中使用和呈現(xiàn)字體。
FreeType最初是作為一個(gè)獨(dú)立項(xiàng)目開發(fā)的,后來成為許多其他開源軟件的重要組成部分,例如GNU Image Manipulation Program(GIMP)、Ghostscript、LibreOffice等。它也被廣泛應(yīng)用于操作系統(tǒng)中,用于在屏幕上顯示和打印文本。
FreeType支持多種字體格式,包括TrueType(TTF)、OpenType(OTF)、PostScript(PS)、以及其他一些常見的字體格式。它具有強(qiáng)大的字體輪廓解析和渲染功能,可以處理各種字體效果,如抗鋸齒、子像素渲染等。它還支持字體緩存管理、跨平臺(tái)適配等功能,使得字體的渲染和顯示更加高效和靈活。
通過使用FreeType,開發(fā)者可以輕松地在自己的應(yīng)用程序中實(shí)現(xiàn)高質(zhì)量的字體渲染,無論是在計(jì)算機(jī)、移動(dòng)設(shè)備還是嵌入式系統(tǒng)中。它對(duì)于構(gòu)建圖形用戶界面(GUI)、排版系統(tǒng)、圖像處理軟件等具有重要的作用。
總結(jié)起來,FreeType是一個(gè)功能強(qiáng)大的開源字體渲染引擎,為應(yīng)用程序提供了豐富的字體處理和渲染功能,使得字體在屏幕上呈現(xiàn)更加清晰和準(zhǔn)確。
2、交叉編譯freetype
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以確定頭文件的系統(tǒng)目錄為:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
庫(kù)文件的系統(tǒng)目錄為:
LIBRARY_PATH=/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/lib/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/
我們編譯的目的是什么呢
這里先引入一些編譯的知識(shí)
頭文件和庫(kù)文件
頭文件(Header File)通常包含一些函數(shù)、變量、結(jié)構(gòu)體等聲明,用于將這些聲明導(dǎo)入到當(dāng)前源文件中,以便在當(dāng)前源文件中使用這些聲明。頭文件通常以.h為擴(kuò)展名,并通過#include預(yù)處理指令將其包含到源文件中。
庫(kù)文件(Library File)則是已經(jīng)編譯好的二進(jìn)制代碼,包含了一些函數(shù)、變量、結(jié)構(gòu)體等定義,并提供了對(duì)它們的訪問接口。庫(kù)文件通常以.lib(Windows)或.a(Linux)為擴(kuò)展名,并通過鏈接器將其與當(dāng)前源文件進(jìn)行鏈接,以便在運(yùn)行時(shí)使用這些函數(shù)和變量。
頭文件和庫(kù)文件通常都是由第三方庫(kù)提供的,可以通過官方網(wǎng)站下載或者在操作系統(tǒng)上進(jìn)行安裝。在使用一個(gè)庫(kù)時(shí),需要將其頭文件包含到源文件中,并將其庫(kù)文件鏈接到當(dāng)前可執(zhí)行程序中,以便在運(yùn)行時(shí)使用其中的函數(shù)和變量。
也就是說頭文件是我們編譯時(shí)需要導(dǎo)入到源文件(.c)的(.h)文件用于編譯。而庫(kù)文件是編譯好的二進(jìn)制文件鏈接器將他們鏈接起來生成可執(zhí)行文件
編譯是將高級(jí)語言代碼翻譯成機(jī)器語言代碼的過程,通常分為四個(gè)流程:預(yù)處理(Preprocessing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking)。
復(fù)習(xí)一下編譯過程:
預(yù)處理(Preprocessing):預(yù)處理器將源代碼中以“#”開頭的預(yù)處理指令進(jìn)行處理,如#include、#define等,將它們轉(zhuǎn)換為實(shí)際的代碼,并生成一個(gè)新的擴(kuò)展名為“.i”的文件。這個(gè)過程主要是為了方便代碼重用和管理,以及提高編譯效率。
編譯(Compilation):編譯器將預(yù)處理后的代碼(即.i文件)翻譯成匯編語言代碼(即.s文件),并檢查代碼中的語法錯(cuò)誤。編譯器將高級(jí)語言代碼轉(zhuǎn)換成匯編語言代碼的過程中,包括了詞法分析、語法分析、語義分析、優(yōu)化等過程。
匯編(Assembly):匯編器將匯編語言代碼(即.s文件)翻譯成機(jī)器語言代碼(即.o文件)。匯編器將高級(jí)語言代碼轉(zhuǎn)換成機(jī)器語言代碼的過程中,主要是將匯編語言代碼中的指令、寄存器、內(nèi)存地址等轉(zhuǎn)換成相應(yīng)的二進(jìn)制碼。
鏈接(Linking):鏈接器將目標(biāo)文件(即.o文件)和庫(kù)文件(如果有的話)鏈接成一個(gè)可執(zhí)行文件(即.exe文件或.out文件)。鏈接器將目標(biāo)文件和庫(kù)文件中的代碼、數(shù)據(jù)等內(nèi)容合并起來,生成一個(gè)獨(dú)立可執(zhí)行的文件,它包含了程序的完整功能。
c/h->i->s->o->(o+a)->.out/.exe
我們想用一個(gè)開源庫(kù)就會(huì)用到開源庫(kù)里面的頭文件和庫(kù)文件,那么如何找到我們編譯的開源庫(kù)的頭文件和庫(kù)文件,就需要我們將庫(kù)的頭文件和庫(kù)文件放到指定的編譯工具鏈中,這樣編譯時(shí)就會(huì)找到了
也就是說我們要進(jìn)行一下兩個(gè)步驟
1、如果你編譯的是一個(gè)庫(kù),請(qǐng)把得到的頭文件、庫(kù)文件放入工具鏈的 include、lib 目錄里。別的程序要使用這些頭文件、庫(kù)時(shí),會(huì)很方便。
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v –
它會(huì)列出頭文件目錄、庫(kù)目錄(LIBRARY_PATH)。
2、把庫(kù)文件放到板子上的/lib 或/usr/lib 目錄里
程序在板子上運(yùn)行時(shí),需要用到板子上/lib 或/usr/lib 下的庫(kù)文件;程序運(yùn)行時(shí)不需要頭文件。
交叉編譯freetype的過程
freetype 依賴于 libpng,libpng 又依賴于 zlib,所以我們應(yīng)該:先編譯安裝 zlib,再編譯安裝 libpng,最后編譯安裝 freetype。
第1步 確定頭文件、庫(kù)文件在工具鏈中的目錄
先設(shè)置交叉編譯工具鏈:
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ullsdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
這里注意這只是將當(dāng)前shell中的環(huán)境變量更換了,并不會(huì)將.bashrc中的環(huán)境變量進(jìn)行變換。所以當(dāng)我們更換一個(gè)終端后就失效了,想要永久生效,就是修改.bashrc中的文件。
我們可以通過echo $環(huán)境變量名來查看當(dāng)前shell下環(huán)境變量的值
比如
但是.bashrc中的值還是arm
以 IMX6ULL 開 發(fā) 板 為 例 , 它 的 工 具 鏈 是 arm-buildroot-linux-gnueabihf-gcc,可以執(zhí)行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
這個(gè)命令是用來測(cè)試交叉編譯器的預(yù)處理功能。具體來說它通過管道將字符串 ‘main(){}’ 傳遞給 arm-buildroot-linux-gnueabihf-gcc 編譯器,并要求其執(zhí)行預(yù)處理操作。
-E 選項(xiàng)告訴編譯器只執(zhí)行預(yù)處理操作并將結(jié)果輸出到標(biāo)準(zhǔn)輸出。-v 選項(xiàng)用于顯示編譯器的版本和配置信息。最后的短橫線 - 表示從標(biāo)準(zhǔn)輸入讀入數(shù)據(jù)。
執(zhí)行該命令后,arm-buildroot-linux-gnueabihf-gcc 將對(duì)輸入的代碼進(jìn)行預(yù)處理,并輸出預(yù)處理后的代碼到標(biāo)準(zhǔn)輸出。同時(shí)還會(huì)顯示編譯器的版本和配置信息。
需要注意的是,由于這是一個(gè)測(cè)試命令,它不會(huì)生成可執(zhí)行文件或目標(biāo)文件,而是用來驗(yàn)證編譯器是否能夠正確地執(zhí)行預(yù)處理操作。
可以確定頭文件的系統(tǒng)目錄為:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/
bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
庫(kù)文件的系統(tǒng)目錄為:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/
bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib
第2步 交叉編譯、安裝 libpng
freetype 依賴于 libpng,所以需要先編譯、安裝 libpng
將libpng-1.6.37.tar.xz拷貝到./當(dāng)前目錄下
tar xJf libpng-1.6.37.tar.xz
這個(gè)命令是用來解壓縮 libpng-1.6.37.tar.xz 壓縮包的。
tar 是一個(gè)常用的歸檔工具,可以將多個(gè)文件和目錄打包成單個(gè)文件,并在需要的時(shí)候進(jìn)行解包。xJf 參數(shù)告訴 tar 解包并解壓縮一個(gè) xz 壓縮過的 tarball 文件。
具體來說,x 選項(xiàng)表示解包,J 表示使用 xz 壓縮格式,f 表示從文件中提取數(shù)據(jù),并且后面必須跟隨要解包的文件名。因此,tar xJf libpng-1.6.37.tar.xz 命令會(huì)將當(dāng)前目錄下的 libpng-1.6.37.tar.xz 文件解壓縮到當(dāng)前目錄,并創(chuàng)建一個(gè)名為 libpng-1.6.37 的目錄,其中包含所有的文件和子目錄。
注意這是個(gè)小寫x大寫J小寫f
這個(gè)命令是用來配置軟件包以在 arm-buildroot-linux-gnueabihf 主機(jī)上進(jìn)行交叉編譯,并指定一個(gè)臨時(shí)目錄。
./configure --host= arm-buildroot-linux-gnueabihf --pre
fix=$PWD/tmp
./configure 是一個(gè)常見的腳本,用于自動(dòng)檢測(cè)系統(tǒng)環(huán)境并生成適合當(dāng)前系統(tǒng)的編譯選項(xiàng)。通過運(yùn)行這個(gè)腳本,您可以為軟件包指定一些選項(xiàng),例如安裝路徑、編譯器、依賴項(xiàng)等。
–host=arm-buildroot-linux-gnueabihf 參數(shù)告訴 configure 腳本,我們希望將軟件包配置為在 arm-buildroot-linux-gnueabihf 主機(jī)上進(jìn)行交叉編譯。這是因?yàn)樵撝鳈C(jī)使用的是 ARM 架構(gòu),與當(dāng)前系統(tǒng)架構(gòu)不同。
–prefix=$PWD/tmp 參數(shù)設(shè)置安裝路徑為當(dāng)前工作目錄下的 tmp 目錄。通常,這個(gè)臨時(shí)目錄用于存放交叉編譯后的二進(jìn)制文件和庫(kù)文件,而不會(huì)對(duì)系統(tǒng)產(chǎn)生影響。
注意, P W D 表示當(dāng)前工作目錄的路徑。然后執(zhí)行 b o o k @ 100 a s k : / l i b p n g ? 1.6.37 PWD 表示當(dāng)前工作目錄的路徑。 然后執(zhí)行 book@100ask:~/libpng-1.6.37 PWD表示當(dāng)前工作目錄的路徑。然后執(zhí)行book@100ask:?/libpng?1.6.37 make
book@100ask:~/libpng-1.6.37$ make install
運(yùn)行配置文件時(shí)不會(huì)生成tmp文件
需要make 和 make install 后自動(dòng)生成
然后復(fù)制文件
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib/
引入知識(shí)點(diǎn)
/…/
在 Linux 和 Unix 系統(tǒng)中,/…/ 是一個(gè)特殊的路徑符號(hào),表示返回到上一級(jí)目錄。這個(gè)符號(hào)用于簡(jiǎn)化路徑,在指定路徑時(shí)可以去掉它。
例如,假設(shè)當(dāng)前工作目錄為 /home/user/Documents,那么路徑 /home/user/Documents/…/Downloads 可以簡(jiǎn)化為 /home/user/Downloads,因?yàn)?/…/ 表示返回到上一級(jí)目錄 /home/user。
需要注意的是,如果一個(gè)路徑中包含多個(gè) /…/,則它們可以被合并成一個(gè),例如:
/home/user/Documents/…/…/Downloads 可以簡(jiǎn)化為 /home/Downloads。
/home/user/Documents/…/Downloads/…/Pictures 可以簡(jiǎn)化為 /home/user/Pictures。
在編寫腳本或命令時(shí),正確使用路徑符號(hào)可以讓代碼更加簡(jiǎn)潔和可讀,也可以避免一些路徑相關(guān)的錯(cuò)誤。
cp
cp -rfd 是 cp 命令的另一種參數(shù)組合,用于復(fù)制文件或目錄,并在復(fù)制過程中進(jìn)行一些操作。具體含義如下:
-r 選項(xiàng)表示遞歸地復(fù)制目錄及其內(nèi)容。
-f 選項(xiàng)表示強(qiáng)制復(fù)制,即在目標(biāo)位置已有同名文件或目錄時(shí),不提示用戶而是直接覆蓋。
-d 選項(xiàng)表示復(fù)制時(shí)保留符號(hào)鏈接,而不是解引用它們。
因此,cp -rfd 命令通常用于遞歸地復(fù)制目錄及其內(nèi)容,并且在復(fù)制過程中保留符號(hào)鏈接。同時(shí),它也會(huì)在目標(biāo)位置已存在同名文件或目錄時(shí)進(jìn)行覆蓋。這種參數(shù)組合可以在需要復(fù)制目錄結(jié)構(gòu)并保留符號(hào)鏈接的情況下使用。
當(dāng)使用 cp 命令復(fù)制文件或目錄時(shí),如果原始文件或目錄中包含符號(hào)鏈接(軟鏈接),默認(rèn)情況下 cp 命令會(huì)解引用這些符號(hào)鏈接,并復(fù)制它們所指向的實(shí)際文件或目錄。但是使用 -d 選項(xiàng)后,cp 命令會(huì)保留這些符號(hào)鏈接,而不是解引用它們。
舉個(gè)例子,假設(shè)有一個(gè)名為 source 的目錄,其中包含一個(gè)名為 file1 的普通文件和一個(gè)名為 link1 的符號(hào)鏈接,指向 file1?,F(xiàn)在我們使用 cp -rd source destination 命令將 source 目錄復(fù)制到 destination 目錄:
bash
$ ls -l source
-rw-r–r-- 1 user user 10 Jan 3 15:00 file1
lrwxrwxrwx 1 user user 5 Jan 3 15:01 link1 -> file1
默認(rèn)情況下,如果我們運(yùn)行 cp -r source destination,那么 destination 目錄中的 link1 將會(huì)變成一個(gè)指向 file1 的新文件,而不再是一個(gè)符號(hào)鏈接。但是如果我們運(yùn)行 cp -rd source destination,那么 destination 目錄中的 link1 將保持為一個(gè)符號(hào)鏈接,仍然指向 file1。
這樣做的好處是,在目標(biāo)位置保留符號(hào)鏈接可以使得目標(biāo)位置的目錄結(jié)構(gòu)保持原樣,符號(hào)鏈接仍然指向正確的文件或目錄,而不會(huì)被解引用導(dǎo)致指向錯(cuò)誤的位置。
編譯freetype
freetype 依賴于 libpng,libpng 又依賴于 zlib,所以我們應(yīng)該:先編譯安裝 zlib,再編譯安裝 libpng,最后編譯安裝 freetype。但是,有些工具鏈里有 zlib, 那就不用編譯安裝 zlib,比如 STM32MP157。本節(jié)文檔以 IMX6ULL 開發(fā)板中 arm-buildroot-linux-gnueabihf-gcc 工具鏈為例,對(duì)于其他開發(fā)板:工具鏈可能不一樣,請(qǐng)靈活變通。
第一步設(shè)置交叉編譯工具鏈
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ullsdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
以 IMX6ULL 開 發(fā) 板 為 例 , 它 的 工 具 鏈 是 arm-buildroot-linux-gnueabihf-gcc,可以執(zhí)行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以確定頭文件的系統(tǒng)目錄為:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
庫(kù)文件的系統(tǒng)目錄為:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib
第二步編譯libpgn
但是注意這個(gè)存在問題我在這搞了一天還是官方幫搞定的
邏輯是這樣的先編譯freetype
./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp
這里已經(jīng)包含bzip2和libpng了那就不要按照原有手冊(cè)上編譯libpng了,編譯了反而出錯(cuò)。導(dǎo)致lib里面的文件為x86-64具體原因我沒弄明白。
這個(gè) 注意編譯后的頭文件和庫(kù)文件都放在這兩個(gè)鏈接下,這個(gè)手冊(cè)上有問題:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
庫(kù)文件的系統(tǒng)目錄為:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib