基本上打開 vc9_lame.sln 就可以build 了,但是這是 Windows 版本
選擇 solution platform
改成 STANDARDSDK_500 (MIPS)
copy from WIN32
基本上
從Windows porting 到 WINCE 會遇到下列問題
1. WINCE 沒有
signal.h
errno.h
fcntl.h
io.h
沒有
sys/types.h
sys/stat.h
sys/timeb.h
沒有
SetPriorityClass(), ftime()
沒定義 _IOFBF, 其值為0
2. 要定義 _MIPS_, 跟 STRSAFE_NO_DEPRECATE
STDIN_FILENO, STDOUT_FILENO。STDERR_FILENO
http://checko.blogspot.tw/2006/03/file-and-stream-stdin-and-stdinfileno.html
http://www.mail-archive.com/dev@apr.apache.org/msg18982.html
http://forum.soft32.com/pda/Porting-app-GetStdHandle-ftopict51244.html
3. 最好定義 _WIN32_WCE, Link Subsystem 要指定為WINDOWSCE
在 build LAME 時 會出現一個 warning
'strdup' undefined; assuming extern returning int
把 strdup 改成 _strdup 就好了
4. mpglib & libmp3lame 容易過關
但是frontend 的 lame.exe 部份就要修改
lametime.c 沒有 clock(), time(),
parse.c 沒有 FindFirstFileA 要改成 FindFirstFileW
沒有 SetPriorityClass(), WINCE 是直接 map 248-255 這8個 (0 最高255最低)
Windows 是6個Priority Class 7個 Priority Level
6 * 7 = 42 種組合 map 到 0-31 priority ( 0 最低)
5. 沒有 stdint.h 這個檔案是c99 相關的, VS2008 (包含)以前的版本都不支援,(VS2008 C99 支援很差?) 在Visual Studio 2010 的版本,放在 \vc\include 下
6. 有 setvbuf 卻沒有定義 _IOFBF _IONBF ...
最後有一堆 Linking Error
因為用 wmain 所 entry point 要設成 mainWCRTStartup
Windows CE supports the following CRT entry points:
- mainACRTStartup for applications that define the main function
- mainWCRTStartup for applications that define the wmain function
- WinMainCRTStartup for applications that define the WinMain function
- wWinMainCRTStartup for applications that define the wWinMain function
- _DllMainCRTStartup for DLLs
沒有 _wgetenv, GetConsoleOutputCP
沒有 powf, log10f 改成 pow, log10
沒有 time(), 因為被 preprocessor 改成 _time64()
lame_get_file_size 的問題
需要在 FILE* 和 HANDLE 之間轉換
_get_osfhandle 可以把 file descriptor 轉成 file handle
_fileno 可以把 file pointer (FILE*) 轉成 file descriptor
但是
在WINCE下沒有 _get_osfhandle
沒有留言:
張貼留言