Join Today
+ Reply to Thread
Page 1 of 6 12345 ... LastLast
Results 1 to 10 of 56

Thread: EZX on a1200

  1. #1
    Join Date
    Sep 2006
    Location
    Rio de Janeiro, Brasil
    Posts
    117

    Default EZX on a1200

    Hi , I want to compile prg with a1200, but de ezx-0.2 come with a example that I can not compile.
    The Makefile on helloworld directory come with a ref to a lib that dont exist on my a1200:
    -lezxnotification

    I don't have im my phone a file libezxnotification.s

    Can any one give some hints?

    Thanks in advance

  2. #2

    Default Re: EZX on a1200

    lib is A1200 is changed. it's name doesn't have -xscale-r suffix like A780/E680i. so i change LIBS name in .pro file from (for A780/E680i)

    ######################################################################
    # Automatically generated by qmake (1.07a) Sun Oct 1 10:13:03 2006
    ######################################################################

    TEMPLATE = app
    INCLUDEPATH += .
    INCLUDEPATH +=/opt/qt/include
    INCLUDEPATH +=/opt/dev-ezx/include/ezx
    LIBS += -L${EZXDIR}/lib/ezx/lib -lezxappbase-xscale-r -lqte-mt-xscale-r -lezxjpeg-xscale-r

    # Input
    SOURCES += helloworld.cpp


    to (for A1200)

    ######################################################################
    # Automatically generated by qmake (1.07a) Sun Oct 1 10:13:03 2006
    ######################################################################

    TEMPLATE = app
    INCLUDEPATH += .
    INCLUDEPATH +=/opt/qt/include
    INCLUDEPATH +=/opt/dev-ezx/include/ezx
    LIBS += -L${EZXDIR}/lib/ezx/lib -lezxappbase -lqte-mt -lezxjpeg

    # Input
    SOURCES += helloworld.cpp


    now ezxcrosstool can compile my app. BUT it got a new Error.

    Undefined reference to ZApplication::setMainWidget (QWidget*)
    and
    Undefined reference to 'vtable for MyWidget'


    any ideas about this? if I try to compile no UI application. it's work. but It's error when compile application that have a Widget.

    PS. I build sam7's ezxcrosstool and use his ezx-dev plus qmake.
    every application work fine on my A780. sample .pro is from sam7's Helloworld but create new project file helloworld.pro and Makefile with qmake.

  3. #3
    Join Date
    Sep 2006
    Location
    Rio de Janeiro, Brasil
    Posts
    117

    Default Re: EZX on a1200

    Yes, I had changed it.
    But I got more errors than you.



    ezx-devel@leonardo:~/dev-ezx-0.2.0/helloworld-qmake$ make
    arm-linux-g++ -Wl,-rpath-link,/home/ezx-devel/ezx-crosstool-0.5/gcc-arm-iwmmxt/gcc-3.3.6-glibc-2.3.2/arm-linux/arm-linux/lib -Wl,-rpath-link,/home/ezx-devel/build/qt/lib -o helloworld helloworld.o -L/home/ezx-devel/build/qt/lib -L/home/ezx-devel/dev-ezx-0.2.0/ezx/lib -L/home/ezx-devel/dev-ezx-0.2.0/ezx/lib/ezx/lib -lezxappbase -lqte-mt -lezxjpeg
    /home/ezx-devel/ezx-crosstool-0.5/gcc-arm-iwmmxt/gcc-3.3.6-glibc-2.3.2/arm-linux/lib/gcc-lib/arm-linux/3.3.6/../../../../arm-linux/bin/ld: warning: libezxjpeg.so.1, needed by /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libqte-mt.so, not found (try using -rpath or -rpath-link)
    /home/ezx-devel/ezx-crosstool-0.5/gcc-arm-iwmmxt/gcc-3.3.6-glibc-2.3.2/arm-linux/lib/gcc-lib/arm-linux/3.3.6/../../../../arm-linux/bin/ld: warning: libipp-jp.so.1, needed by /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so, not found (try using -rpath or -rpath-link)
    /home/ezx-devel/ezx-crosstool-0.5/gcc-arm-iwmmxt/gcc-3.3.6-glibc-2.3.2/arm-linux/lib/gcc-lib/arm-linux/3.3.6/../../../../arm-linux/bin/ld: warning: libipp-miscGen.so.1, needed by /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so, not found (try using -rpath or -rpath-link)
    helloworld.o(.text+0x2e4): In function `main':
    : undefined reference to `ZApplication::setMainWidget(QWidget*)'
    helloworld.o(.text+0x500): In function `MyWidget::staticMetaObject()':
    : undefined reference to `QMetaObject::new_metaobject(char const*, char const*, QMetaData*, int, QMetaData*, int, QClassInfo*, int)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x10): undefined reference to `ZMainWidget::event(QEvent*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x10c): undefined reference to `ZMainWidget::keyPressEvent(QKeyEvent*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x140): undefined reference to `ZMainWidget::qwsEvent(QWSEvent*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1a4): undefined reference to `ZMainWidget::updateInputWidgetState(int, bool)'
    helloworld.o(.gnu.linkonce.t._ZN8MyWidget10showDialogEv+0x2c): In function `MyWidget::showDialog()':
    : undefined reference to `RES_ICON_Reader::getIcon(char const*)'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffmanSpecInit_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffmanStateGetBufSize_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGR555ToYCbCr422LS_MCU_16u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr422ToBGR565LS_MCU_16s16u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiCopyExpand_8u_C3'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr444ToBGR565LS_MCU_16s16u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGRToYCbCr422LS_MCU_8u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGR565ToYCbCr444LS_MCU_16u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr444ToBGRLS_MCU_16s8u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffman8x8_Direct_JPEG_1u16s_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr444ToBGR555LS_MCU_16s16u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffmanStateInit_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr422ToBGR555LS_MCU_16s16u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr411ToBGRLS_MCU_16s8u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffmanSpecGetBufSize_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDCTQuantFwdTableInit_JPEG_8u16u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxappbase.so: undefined reference to `miscInitGeneralCallbackTable'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffman8x8_Direct_JPEG_16s1u_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr422ToBGRLS_MCU_16s8u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr411ToBGR565LS_MCU_16s16u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGR555ToYCbCr411LS_MCU_16u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffmanStateGetBufSize_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGRToYCbCr411LS_MCU_8u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiYCbCr411ToBGR555LS_MCU_16s16u_P3C3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGR565ToYCbCr411LS_MCU_16u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDCTQuantInvTableInit_JPEG_8u16u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGR555ToYCbCr444LS_MCU_16u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDCTQuantInv_JPEG_16s'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDCTQuantFwd_JPEG_16s_I'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffmanSpecGetBufSize_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxappbase.so: undefined reference to `miscFreeGeneralCallbackTable'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGR565ToYCbCr422LS_MCU_16u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffmanStateInit_JPEG_8u'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiBGRToYCbCr444LS_MCU_8u16s_C3P3R'
    /home/ezx-devel/dev-ezx-0.2.0/ezx/lib/libezxjpeg.so: undefined reference to `ippiEncodeHuffmanSpecInit_JPEG_8u'
    collect2: ld returned 1 exit status
    make: ** [helloworld] Erro 1
    Brazilian Motorola User
    A1200 , 08P

  4. #4
    Join Date
    Sep 2006
    Location
    Rio de Janeiro, Brasil
    Posts
    117

    Default Re: EZX on a1200

    Changing the Makefile if more libs:
    LIBS=-lezxappbase -lqte-mt -lezxjpegutils -lezxjpeg -lipp-jp -lezxexif -lipp-codecJP

    I got less error:

    ezx-devel@leonardo:~/dev-ezx-0.2.0/helloworld$ make
    arm-linux-g++ helloworld.o -o helloworld -L../lib -L../lib/ezx/lib -lezxappbase -lqte-mt
    /home/ezx-devel/ezx-crosstool-0.5/gcc-arm-iwmmxt/gcc-3.3.6-glibc-2.3.2/arm-linux/lib/gcc-lib/arm-linux/3.3.6/../../../../arm-linux/bin/ld: warning: libezxjpeg.so.1, needed by ../lib/ezx/lib/libqte-mt.so, not found (try using -rpath or -rpath-link)
    helloworld.o(.text+0x5c):../include/qt/qstring.h:655: undefined reference to `ZApplication::setMainWidget(QWidget*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x10): undefined reference to `ZMainWidget::event(QEvent*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x10c):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:79: undefined reference to `ZMainWidget::keyPressEvent(QKeyEvent*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x150):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.moc:54: undefined reference to `ZMainWidget::qwsEvent(QWSEvent*)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1a0):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.moc:59: undefined reference to `QWidget::globalRect()'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1a4):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:80: undefined reference to `QWidget::sendPackage()'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1a:/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:80: undefined reference to `QWidget::getPackageType()'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1ac):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.moc:60: undefined reference to `QWidget::setPackageType(int)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1b0):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:81: undefined reference to `QWidget::getPtfText()'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1b4):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:81: undefined reference to `QWidget::setPtfText(QString const&)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1b:/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:81: undefined reference to `QWidget::getPtfPixmap()'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1bc):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:81: undefined reference to `QWidget::setPtfPixmap(QPixmap const&)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1c0):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:81: undefined reference to `QWidget::getPtfIconId()'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1c4):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:81: undefined reference to `QWidget::setPtfIconId(QString const&)'
    helloworld.o(.gnu.linkonce.r._ZTV8MyWidget+0x1dc):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:83: undefined reference to `ZMainWidget::updateInputWidgetState(int, bool)'
    helloworld.o(.gnu.linkonce.t._ZN8MyWidget10showDialogEv+0x34):/home/ezx-devel/devel/dev-ezx-0.2.0/helloworld/helloworld.cpp:107: undefined reference to `RES_ICON_Reader::getIcon(char const*)'
    ../lib/ezx/lib/libezxappbase.so: undefined reference to `DecoderFree_JPEG'
    ../lib/ezx/lib/libqte-mt.so: undefined reference to `EncoderFree_JPEG'
    ../lib/ezx/lib/libezxappbase.so: undefined reference to `DecoderInitAlloc_JPEG'
    ../lib/ezx/lib/libqte-mt.so: undefined reference to `Encode_JPEG'
    ../lib/ezx/lib/libezxappbase.so: undefined reference to `miscInitGeneralCallbackTable'
    ../lib/ezx/lib/libqte-mt.so: undefined reference to `EncoderInitAlloc_JPEG'
    ../lib/ezx/lib/libqte-mt.so: undefined reference to `Decode_JPEG'
    ../lib/ezx/lib/libezxappbase.so: undefined reference to `miscFreeGeneralCallbackTable'
    collect2: ld returned 1 exit status
    make: ** [helloworld] Erro 1
    Brazilian Motorola User
    A1200 , 08P

  5. #5
    Join Date
    Nov 2005
    Location
    France
    Posts
    99

    Default Re: EZX on a1200

    you need to reverse engineer the headers and modify the dev-ezx ones to adapt the new changes that have been made for the a1200. Thus in order to reconstruct from scratch the library headers files from the stripped binaries present on the phone you can play with:

    arm-linux-objdump -T --demangle libezxappbase.so
    arm-linux-nm -aDC libezxappbase.so
    Phones: a780/a910/a1200/rokre2/rokre6
    http://www.courville.org/mediawiki/index.php/EZX

  6. #6

    Default Re: EZX on a1200

    @bragon
    how can i reverse engineering a1200 lib? did you mean we should create new header file (*.h) for A1200 to use with ezx-crosstool.


    BTW there is no ZApplication::setMainWidget inside it. how can we create graphic interface application with out setMainWidget.

    I attached result file from objdump and nm on libezxappbase.so.
    Attached Files Attached Files

  7. #7

    Default Re: EZX on a1200

    @eakrin
    i'm not sure if this will help, but i noticed that the ezxappbase contains a ZApplication::showMainWidget(QWidget*) (at least i found in in the files in your zip file above), so i gave it a quick try with a ezx version of the drawdemo from the qt examples and showMainWidget seems to work in place of setMainWidget (at least for my current e680i builds and tests), so you might try the same replacement in the helloworld app you are trying to build.

    it also looks like the UTIL_CST functions (for the native ezx lower tool bar control), the ZMessageBox functions, as well as the RES_ICON_reader are included in ezxappbase so we might be okay with only using new libs (and an updated Makefile) and not have to re-do much, if any, of the include files from samr7's dev-kit.

    If the ezxnotification lib doesn't seem to be found in the a1200, try dropping it from the LIBS definition in the Makefile; at least it worked for my primiative test.

    and finally, i am by far no expert but i found that 'vtable for XXX' errors can often be fixed by deleting the .moc file and forcing it to be remade during the Make procedure; just thought i'd pass that along...

    and most of all, keep plugging away and thanks for sharing your work!!!

  8. #8
    Join Date
    Sep 2005
    Location
    Jakarta, Indonesia
    Posts
    1,091

    Default Re: EZX on a1200

    @eakrin
    Thanks for sharing.

    @eakrin, rpconnect
    Have no ZApplication::setMainWidget(QWidget*) but QApplication::setMainWidget(QWidget*) . Maybe you can try:
    Code:
    int main(int argc, char** argv)
    {
    	ZApplication app(argc, argv);
    	MyWidget *wp = new MyWidget(NULL);
    	qApp->setMainWidget(wp);
    	wp->show();
    	return app.exec();
    }
    eXMMS and Rockbox running on E680, E680i, E680g, A780, A1200 and ROKR E6

  9. #9

    Default Re: EZX on a1200

    @blackhawk,eakrin
    I had tried the qApp approach to settinng the main widget when trying to get qtopia examples to work in ezx, the app would run without errors but the problem was the app didn't seem to get "checked in" to the application manager and screen taps were fed to the background app which would take control and i'd loose control of the qApp. I should try it again however because I was trying to force a QApplication and ZApplication at the same time.

    ZApplication::showMainWidget() seemed to do the same as setMainWidget and seems to behave nicely with the natively running apps.

  10. #10

    Default Re: EZX on a1200

    @blackhawk, rpconnect
    thx for you suggestion. I try qApp->setMainWidget and app.showMainWidget. both work with ezx-crosstool + A1200 libraries. but still got an error ': undefined reference to 'vtable for MyWidget'

    I does not understand much about what is moc file. coz i'm newbie in QT/Linux complier. but i have a little modiflied sam7 's helloworld. that sam7 use moc file and his Makefile gave me a huge binary. so i create a new project file by qmake. and create new Makefile by qmake too. from blackhawk's Texteditor.

    so what can i do about :undefined reference to 'vtable for MyWidget' error?

    my ezxcrosstool was build on cygwin in windowsXP SP2. everything work fine for A780 lib and app.

    and here is an A1200 lib
    Attached Files Attached Files


 
+ Reply to Thread
Page 1 of 6 12345 ... LastLast

Similar Threads

  1. A Comprehensive List of Non-EZX Firmwares for the A1200
    By that-squirrel in forum A1200 Firmware
    Replies: 1
    Last Post: 09-10-2010, 12:23 AM
  2. EZX Crosstool and SDK for Motorola EZX phones
    By eakrin in forum Development
    Replies: 108
    Last Post: 11-10-2009, 11:13 AM
  3. The way to E6/A1200 Native EZX Application
    By donga in forum Development Stickys
    Replies: 57
    Last Post: 06-06-2008, 07:25 AM
  4. installing EZX on a1200
    By sreenathsreenath in forum A1200 General Chat
    Replies: 16
    Last Post: 02-07-2007, 12:11 AM
  5. about EZX for A1200 harvest
    By yxye in forum A1200 General Chat
    Replies: 8
    Last Post: 10-20-2006, 02:16 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
Single Sign On provided by vBSSO

Search Engine Friendly URLs by vBSEO 3.6.0 RC 1