一、前言
這兩天接到的兩個關於Linux 平臺相關的項目,一個Linux 桌面平臺的工具開發,另一個是與客戶使用的ARM 平臺相關的工具編寫。客戶環境爲三星 ARM 平臺Linux 環境,因而需要我們公司提供arm 平臺動態庫給他們。於是,這個項目落在我的身上,好久沒有編寫過ARM平臺相關的東西。因此,寫下這篇文章,記錄我使用Ubuntu 安裝交叉編譯工具<arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz>,編寫使用交叉編譯工具編寫動態庫過程。
二、開發環境:
Linux: Ubuntu 16.04 64位桌面版
交叉編譯工具:arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz
三、安裝交叉編譯工具
3.1 將arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz 從共享文件夾中,複製的home/tool 目錄下,如圖:
進入tool目錄,解壓解壓:arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz,得到 4.9.3 目錄
執行如下命令:tar xvJf
arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz
3.2 依據傳統,^_^ 在 /usr/local/ 新建一個 名稱爲 arm 目錄,然後將 4.9.3 目錄及目錄下所有文件拷貝到arm 目錄下,如:
cp -rf /4.9.3 /usr/local/arm/ , 進入arm 目錄,可以看到4.9.3 目錄。
3.3 配置Linux 系統環境變量,在 ~/.bashrc 最後一行添加,環境變量代碼,如下,
vim ~/.bashrc
3.3.1 使用vim 打開bashrc , 進入文件最後一行,添加如下代碼:
PATH=$PATH:/usr/local/arm/4.9.3/bin/
export PATH
3.3.2 重啓登錄即可使用交叉編譯工具,於是交叉編譯工具安裝配置完畢。
四、測試安裝的交叉編譯工具是否安裝成功
4.1 檢測交叉編譯工具是否安裝成功並且環境變量是否配置正確,可以使用如下方法測試:
4.1.1 查看gcc 編譯版本,即可,使用如下命令:
arm-cortexa9-linux-gnueabihf-gcc -v
顯示如下信息,則爲安裝成功。
五、編寫程序helloworld.c 程序驗證arm-linux-gcc 是否可以使用
5.1.1 使用gcc helloworld.c -o helloworld 命令編譯通過,代碼沒有問題,
5.2.1 將gcc 換成,arm-cortexa9-linux-gnuebinf-gcc
arm-cortexa9-linux-gnuebinf-gcc helloworld.c -o helloworld ,發現出現如下致命錯誤:
arm-cortexa9-linux-gnueabihf-gcc: fatal error: -fuse-linker-plugin, but liblto_plugin.so not found
compilation terminated.
在度娘找了半天,任然沒有發現問題的解決辦法,好像沒有人遇到過。o(╥﹏╥)o
o(╥﹏╥)o ,是不是系統太老呢,(因爲上一個項目是在Ubuntu 12.04 下開發的,因此,這個項目也是一樣使用12.04),於是換個Ubuntu 17.04 系統看試一下,結果發現還是一樣,出現這個問題。
研究,別人安裝交叉編譯工具的流程,發現都是這樣子的,沒有什麼不同,安裝完後,查看arm-cortexa9-linux-gnuebinf-gcc -v
都是可以看的到版本信息。這就奇怪了,╮(╯▽╰) ╭╮(╯▽╰)╭
後來,偶然間發現上面的交叉編譯工具是2016年出來的,會不會與Ubuntu 環境,有關係。抱着試試的態度,我又安裝了一個Ubuntu 16.04 系統,然後按着步驟安裝交叉編譯工具,然後執行arm-cortexa9-linux-gnuebinf-gcc helloworld.c -o helloworld
沒有報錯,正常通過。o(╥﹏╥)o o(╥﹏╥)o 好像與Linux 版本有關係,爲什麼網上就沒有人遇到過呢??????
開源項目雖好,但是兼容性太差了,差了一個版本就不能用,這也太坑了。╮(╯▽╰)╭
六、使用arm-cortexa9-linux-gnuebinf-gcc 編譯動態庫
6.1 編寫MakeFile 和源代碼。
執行使用gcc make 導出.so , 正常運行,如下圖:
6.2 將MakeFILE 中gcc 該成arm-cortexa9-linux-gnueabihf-gcc
make 導出.so 出現如下錯誤,
strip: Unable to recognise the format of the input file `libicmmodule.so'
Makefile:24: recipe for target 'libicmmodule.so' failed
make: *** [libicmmodule.so] Error 1
發現,原來是Makefile 中使用strip 去除和剝掉一些符號信息和調試信息時報錯,進入MakeFile 發現,沒有將gcc 下的strip,修改成arm-cortexa9-linux-gnueabihf-gcc 對應的 arm-linux-strip 。
修改Makefile文件,
重新make ,成功,O(∩_∩)O哈哈~。
好了,終於寫完了這篇文章了,對於小白的我,寫下這篇文章還是非常有必要的,防止下次項目又會遇到,好記憶不如爛筆頭。
半夜12點了,睡覺了。(¦3[▓▓] 晚安。