2013年3月12日 星期二

about ARM- 去年十二月出的新版OSELAS


mini2440搭配2012/12出的新版OSELAS:
ptxdist-2012.12.0
OSELAS.BSP-Pengutronix-Mini2440-2012.12.0
OSELAS.Toolchain-2012.12.0

HOST與TARGET都裝好,環境是上面平台提供的Qt,
我HOST環境變數只多設:
export PATH=/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-cross/bin:/opt/OSELAS.Toolchain-2012.12.0/arm-v4t-linux-gnueabi/gcc-4.7.2-glibc-2.16.0-binutils-2.22-kernel-3.6-sanitized/bin:$PATH
export QMAKESPEC=/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/packages/qt-everywhere-opensource-src-4.8.4/usr/mkspecs/default

對用C++寫的Qt程式作cross編譯連結過程: (i.e.於HOST編譯連結 產生之執行檔將於TARGET執行)
1. qmake -project
2. 改 <.pro檔>   # 加 MOC_DIR = moc  與 OBJECTS_DIR = obj  兩行; 並填執行檔名於 TARGET =
3. qmake -o Makefile <.pro檔>
4. make

於第4.的make過程會出現讀如以下問題:
......
arm-v4t-linux-gnueabi-g++ -Wl,-O1 -o ButtonWindow obj/ButtonWindow.o obj/moc_ButtonWindow.o    -L/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/lib -L/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/usr/lib -L/mnt/arm/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/usr/lib -lQtGui -L/mnt/arm/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/usr/lib -L/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/lib -L/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/usr/lib -lQtNetwork -lQtCore -lpthread
/mnt/opt4arm/opt.2/OSELAS.Toolchain-2012.12.0/arm-v4t-linux-gnueabi/gcc-4.7.2-glibc-2.16.0-binutils-2.22-kernel-3.6-sanitized/bin/../lib/gcc/arm-v4t-linux-gnueabi/4.7.2/../../../../arm-v4t-linux-gnueabi/bin/ld: warning: libts-0.0.so.0, needed by /home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/usr/lib/libQtGui.so, not found (try using -rpath or -rpath-link)
/mnt/opt4arm/opt.2/OSELAS.Toolchain-2012.12.0/arm-v4t-linux-gnueabi/gcc-4.7.2-glibc-2.16.0-binutils-2.22-kernel-3.6-sanitized/bin/../lib/gcc/arm-v4t-linux-gnueabi/4.7.2/../../../../arm-v4t-linux-gnueabi/bin/ld: warning: libpng12.so.0, needed by /home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/sysroot-target/usr/lib/libQtGui.so, not found (try using -rpath or -rpath-link)
...........

即make過程中,用arm-v4t-linux-gnueabi-g++能成功編譯出 .o 目的檔,這些目的檔置於上面所設的 obj/ 目錄下
然而用ld連結時發生問題,這可能是由於ld預設不含入C++程式庫使然

我的替代方案:連結時仍持續用g++ ,代替上面的ld, 上面ld找不到的程式庫於g++以-l含入
例如 目錄obj/中 有因上面make過程而編譯好的 ButtonWindow.o 與 moc_ButtonWindow 兩檔,欲將其連結成setskin執行檔,則以下行g++代替ld:
arm-v4t-linux-gnueabi-g++ -Wl,--as-needed -Wl,--no-undefined -Wl,-z,relro -Wl,-O1 -Wl,--build-id -Wl,--enable-new-dtags -Wl,-O1 -o setskin obj/ButtonWindow.o obj/moc_ButtonWindow.o -L/home/local/OSELAS.BSP-Pengutronix-Mini2440-2012.12.0/platform-mini2440/root/usr/lib -lQtGui -lQtNetwork -lts -lpng -lz -lfreetype -lQtCore -lpthread

上行產生出的setskin 即能於TARGET中順利執行