https://github.com/zytc2009/BigTeam_learning
分类: Java
2010-12-01 11:04:49
一、目的 .............................................................................. |
2 |
二、環境 & 所需工具 ............................................................... |
2 |
三、編譯前的準備 .................................................................. |
2 |
四、開始編譯 OpenCORE .................................................... |
2 |
五、註解掉 XCXXFLAGS 參數之原因 .................................... |
6 |
六、編譯後所產生的 library 及 binary 執行檔 ...................... |
8 |
七、檢驗 binary 執行檔及 library 之完整度 .......................... |
9 |
八、測試前的注意事項 ......................................................... |
12 |
九、測試執行檔 .................................................................... |
15 |
一、目的
在 x86 Linux 平臺上 ( 例如 PC) ,編譯 OpenCORE 的 source code ,並利用內建的 test application 來對所產生的 library 進行驗證,確保其可用性。
二、環境 & 所需工具
OS |
Ubuntu 9.04 |
GCC |
v4.3.3 |
G++ |
v4.3.3 |
make |
v3.81 |
UnZip |
v5.52 |
三、編譯前的準備
1. 安裝 GCC 、 G++ 、 make 、 UnZip
a. 輸入以下指令來更新套件庫
sudo apt-get update |
b. 輸入以下指令來安裝所需工具
sudo apt-get install gcc g++ make unzip |
四、開始編譯 OpenCORE
1. 將 OpenCORE source code 的壓縮檔解壓縮
( 假設壓縮檔放在自己的家目錄下 )
unzip opencore.zip |
2. 進入 opencore source code 資料夾
cd opencore |
3. 執行以下指令並 記下此路徑 ( 之後會常用到 )
pwd |
以下為我的執行結果: ( 每個人的執行結果均不同 )
之後只要提到 <opencore > 就代表是這個路徑的意思。
4. 進入以下目錄
cd <opencore >/build_config/opencore_dynamic |
<opencore > 即為第 3 步所得到之路徑
5. 執行以下指令來設定環境變數
source setup.sh <opencore > |
<opencore > 即為第 3 步所得到之路徑
6. 執行以下指令來開始編譯 OpenCORE source code
make |
7. 遇到第一個 Error
從此 error message 可得知,在編譯 source code 過程中有一些 warning 被當成 error ,為了使編譯能夠完成,必須修改 gcc 編譯的參數,使其不要將 warning 當成 error 。
8. 執行以下指令來修改 makefile
gedit <opencore >/engines/player/test/build/android/local.mk |
<opencore > 即為第 3 步所得到之路徑
將第 11 行 註解掉 ( 前面加個 # 即可 ) ,如下:
# XCXXFLAGS += $(FLAG_COMPILE_WARNINGS_AS_ERRORS) |
註解之後記得存檔。
9. 繼續執行 make 指令
make |
剛剛的 error 變成 warning 了。
10. 遇到第二個 Error
此 error message 發生原因如同第 7 步所述。11. 執行以下指令來修改 makefile
gedit <opencore >/engines/2way/test/build/make/local.mk |
<opencore > 即為第 3 步所得到之路徑
將第 24 行 註解掉 ( 前面加個 # 即可 ) ,如下:
# XCXXFLAGS += $(FLAG_COMPILE_WARNINGS_AS_ERRORS) |
註解之後記得存檔。
12. 繼續執行 make 指令
make |
13. 遇到第三個 Error
此 error message 發生原因如同第 7 步所述。
14. 執行以下指令來修改 makefile
gedit <opencore >/ engines/pvme/test/build/make/local.mk |
<opencore > 即為第 3 步所得到之路徑
將第 7 行 註解掉 ( 前面加個 # 即可 ) ,如下:
# XCXXFLAGS += $(FLAG_COMPILE_WARNINGS_AS_ERRORS) |
註解之後記得存檔。
15. 繼續執行 make 指令
make |
16. 編譯完成,下一節將解釋為何要註解掉 makefile 中的 XCXXFLAGS 參數。
五、註解掉 XCXXFLAGS 參數之原因
1. 執行以下指令來查看 gcc 的編譯參數
man gcc |
所以表示,當時在 makefile 中定義 gcc 編譯參數時,必定多加了 -Werror 這個選項,導致它將 warning 當成 error 。
那這又和 XCXXFLAGS 這個參數有什麼關係呢?畢竟我們剛剛註解掉的是這個 XCXXFLAGS 這個參數,而不是 -Werror 。
按一下 q 離開 man 模式。
2. 執行以下指令 ( 此一步驟並不需要改動任何東西,請注意 )
gedit <opencore >/opencore/tools_v2/build/make/g++.mk |
<opencore > 即為第四節第 3 步所得到之路徑
在第 26~27 行位置,發現以下兩行:
#Make all warnings into errors. FLAG_COMPILE_WARNINGS_AS_ERRORS := -Werror |
而之前我們註解掉的那一行如下:
XCXXFLAGS += $(FLAG_COMPILE_WARNINGS_AS_ERRORS) |
由上可發現,我們註解掉 XCXXFLAGS 是為了避免它去使用 FLAG_COMPILE_WARNINGS_AS_ERRORS 這個參數,也就是避免使用了 -Werror 這個參數。
那一定有人會疑惑為什麼當初在寫 makefile 時,要加入這參數呢?
原因是因為在寫大型的軟體時,作者都會小心的去撰寫 code ,以免在編譯過程出現任何 warning 或 error ,因為有時某些 warning 也可能是很危險的,所
以最簡單的方式就是使用 -Werror 這參數,連一個 warning 都不允許 !
那為什麼我們卻又註解掉 XCXXFLAGS 這個參數呢?其實仔細看,我們所修改的 makefile ,都是放在 test 資料夾下,這些 source file 並不屬於 OpenCORE 核心部份 ,這些只是最後我們要用的 test application 的 source file 而已,例如:
<opencore >/engines/player/test /build/android/local.mk |
所以在編譯 OpenCORE 核心部份的時候,是連一個 warning 或 error 都沒有出現的,所以產生出來的 library 都是沒有問題的。
而這些出現 warning 的 test application 的 source file ,可能是作者還沒修改的 bug ,基於不修改 source code 的前提下,我們選擇註解掉 XCXXFLAGS 這個參數,讓編譯過程可以完成。
六、編譯後所產生的 library 及 binary 執行檔
1. 第五節所編譯出來產生的 library 都放在:
|
<opencore > 即為第四節第 3 步所得到之路徑
<opencore >/build_config/opencore_dynamic/build/bin/linux |
<opencore > 即為第四節第 3 步所得到之路徑
下一節將檢驗所產生出來的 binary 執行檔及 library 之完整度。七、檢驗 binary 執行檔及 library 之完整度
1. 進入到 binary 執行檔的資料夾
cd <opencore >/build_config/opencore_dynamic/build/bin/linux |
<opencore > 即為第四節第 3 步所得到之路徑
2. 執行以下指令來檢查執行檔是否可在 x86 機器上跑
file test_omx_client |
既然它使用了動態聯結 library ,所以就必須檢查所需的 library 是否都存在,下一步將檢查 library 的存在與否。
3. 執行以下指令來檢查執行檔所需的 library 是否都存在
ldd test_omx_client |
我們可以發現有兩個 library 是 not found !
而根據第六節第 1 步可以知道, not found 的兩個 library 是放在
|
<opencore > 即為第四節第 3 步所得到之路徑
這代表當時在產生這個執行檔時,系統不知道這兩個
library
的位置,所以下一步我們會將這個路徑加到系統中,並重掃一次
library
,讓執行檔可以正確
link
4. 執行以下指令在 /etc/ld.so.conf 中新增動態聯結路徑
( 因為要修改的檔案是需要 root 權限,所以請登入 root 修改,或者使用 sudo )
sudo gedit /etc/ld.so.conf |
請在檔案最後將以下路徑加進去
|
<opencore > 即為第四節第 3 步所得到之路徑
修改完之後記得存檔。5. 執行以下指令來重新掃系統中所有的 library
( 因為要執行的指令是需要 root 權限,所以請登入 root 修改,或者使用 sudo )
sudo /sbin/ldconfig.real -v |
6. 重新執行以下指令來檢查執行檔所需的 library 是否都存在
ldd test_omx_client |
7. 執行以下指令將 pvplayer.cfg copy 到執行檔所在的資料夾
cp <opencore >/pvplayer.cfg \ <opencore >/build_config/opencore_dynamic/build/bin/linux / |
這個 pvplayer.cfg 中是紀錄了 OpenCORE 會用到的 library 的 UUID 。
八、測試前的注意事項
接下來我們會利用編譯 OpenCORE 所產生出來的執行檔來做測試。
1. 測試 PV Player Engine 的功能
利用的執行檔是 pvplayer_engine_test ,此執行檔的參考手冊 在:
<opencore >/doc/pvplayer_engine_unit_test_guide.pdf |
<opencore > 即為第四節第 3 步所得到之路徑
利用的執行檔是 test_omx_client ,此執行檔的參考手冊 在:
<opencore >/doc/ omx_decoder_test_app_guide.pdf |
<opencore > 即為第四節第 3 步所得到之路徑
3. 測試檔所會用到的影音檔 ( 如 xxx.mp4 、 xxx.mp3 、 xxx.aac 、 xxx.264 ...)
MP4 、 MP3 、 AAC 檔案放在以下這個位置
<opencore >/engines/player/test/data |
<opencore > 即為第四節第 3 步所得到之路徑
我們利用 test.mp4 來當測試檔。
H.264 、 AMR 檔案放在以下這個位置
<opencore >/codecs_v2/omx/omx_testapp/data |
<opencore > 即為第四節第 3 步所得到之路徑
我們利用 ba1_sony_c.264 來當測試檔。
4. 將 test.mp4 及 ba1_sony_c.264 檔案 copy 到執行檔所在的資料夾
分別執行以下兩道指令
cp <opencore >/engines/player/test/data/test.mp4 \ <opencore >/build_config/opencore_dynamic/build/bin/linux / |
cp <opencore >/codecs_v2/omx/omx_testapp/data/ba1_sony_c.264 \ <opencore >/build_config/opencore_dynamic/build/bin/linux / |
<opencore > 即為第四節第 3 步所得到之路徑
touch output.txt |
這個檔案是執行檔所需的 output 檔,請自己命名喜歡的檔名,在這邊我把它命名為 output.txt 。
6. 確定回到執行檔所在的資料夾
cd <opencore >/build_config/opencore_dynamic/build/bin/linux / |
<opencore > 即為第四節第 3 步所得到之路徑
7. 確認所需檔案
確認執行檔目錄下有:
兩個執行檔 |
pvplayer_engine_test test_omx_client
|
一個 cfg 檔 |
pvplayer.cfg |
兩個測試影音檔 |
test.mp4 ba1_sony_c.264 |
一個 output 檔 |
output.txt |
九、測試執行檔
1. 測試 PV Player Engine 的功能
利用的執行檔是 pvplayer_engine_test
此執行檔要輸入的參數如下表:
-source InputFile |
InputFile 是要輸入的 file 位置 |
-test a b |
a,b 是要測試的 range ,例如 -test 0 2 就是從第 0 號測試到第 2 號。 |
-logall |
加此選項就可以 log 全部的資訊 |
在參考手冊中,會詳細解說測試編號的細節 ( 例如 -test) 及更多的 log 選項 ( 例如 -logall ) ,請務必要詳細閱讀參考手冊。
參考手冊位置請參考第八節第 1 步。
執行以下指令來利用 test.mp4 檔來測試第 0 個測試,並秀出全部的資訊 。
./pvplayer_engine_test -source test.mp4 -test 0 0 -logall |
輸出的執行畫面最後會秀出一些訊息,說明執行的成功與否、執行時間及 memory 使用狀況 ... 等。
2. 測試 OpenMAX decoder 的功能
利用的執行檔是 test_omx_client
此執行檔要輸入的參數如下表:
InputFile |
InputFile 是要輸入的 file 位置 |
-o OutputFile |
請指定第八節第 5 步所建立的 output 檔。 |
-c xxx |
xxx 是輸入的 file 的檔案類型,例如 H.264 檔就是 avc , MP3 檔就是 mp3 ... 等 |
-t a b |
a,b 是要測試的 range ,例如 -test 0 2 就是從第 0 號測試到第 2 號。 |
-l |
將 log 資訊寫到 log 檔 ( 不需指定位置 ) |
在參考手冊中,會詳細解說測試編號的細節 ( 例如 -t) 及更多的影音檔資訊選項 ( 例如 -c) ,請務必要詳細閱讀參考手冊。
參考手冊位置請參考第八節第 2 步。
執行以下指令來利用 ba1_sony_c.264 這個 avc 檔來測試第 0 ~ 1 個測試,並將資訊寫入 logfile 中。
./test_omx_client ba1_sony_c.264 -o output.txt -c avc -t 0 1 -l |
輸出的執行畫面最後會秀出一些訊息,說明每一個測試的成功與否。 至於一些更詳細的訊息,因為剛剛有加了 -l 選項,所以它會自動寫到當前目目錄的 logfile.txt 中。