Bonjour,

Actuellement sous Ubuntu 10.4, je souhaite cross-compiler (x86 vers arm-v4) des applications en Qt qui utilisent Phonon ainsi qu'OpenSSL.
J'ai installé et configuré scratchbox afin de récupérer le cross-compilateur gcc ainsi qu'un environnement de test/émulation (QEmu).
J'ai compilé un hello world simple (sans Qt) dans scratchbox et je l'ai transféré sur ma carte, ça a marché.
J'ai compilé maintes fois le framework Qt en expérimentant plusieurs configurations...
La première fois avec Qt-4.6.3, je parviens à compiler/executer la plupart des exemples venant de Qt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
./configure -embedded arm -xplatform qws/linux-arm-g++ \
    -prefix /usr/local/Trolltech/Qt-4.6.3-arm \
    -opensource -little-endian
Sauf qu'il n'y a pas Phonon. Et là, ça se complique, j'apprends que Phonon est en fait une abstraction et qu'il repose sur un "backend". Sous Linux, le "backend" par défaut est basé sur gstreamer. Ainsi, je télécharge la plupart des sources que Qt me demande et les cross-compile dans scratchbox (./configure && make && make install)
La liste des bibliothèques requises: glib, gstreamer, gst-plugins, openssl, xml2.

Mon script de configuration:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#!/bin/sh                                                                                                                      
 
scratchboxUser='leflou'
 
./configure -v -embedded arm -xplatform qws/linux-arm-gnueabi-g++ \
    -opensource -little-endian \
    -prefix /usr/local/Trolltech/Qt-4.7.0-arm \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/include \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/include/glib-2.0 \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/include/libxml2 \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/include/gstreamer-0.10 \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/include/gstreamer-0.10/gst \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/include/gstreamer-0.10/gst/interfaces \
    -I /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/ssl/include \
    -L /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/lib \
    -L /scratchbox/users/$scratchboxUser/targets/Arm/usr/local/ssl/lib \
    -rpath -lssl -lcrypto -lz -lxml2 -lgmodule-2.0 -lgobject-2.0 -lglib-2.0 -lgthread-2.0 -lgstreamer-0.10 \
    -nomake demos -nomake example -make tools \
    -multimedia -audio-backend -phonon -phonon-backend -glib \
    -no-mmx -no-3dnow -no-sse -no-sse2 \
    -no-largefile -no-gtkstyle -no-qt3support -no-cups -no-nis
La compilation du framework fonctionne mais lorsque j'éxécute un binaire cross-compilé avec cette configuration, ça "segfault"...

Voici le code source de l'exemple incriminé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
#include <QDebug>                                               
#include <QPushButton>
#include <QApplication>
 
int main(int argc, char** argv)
{
  qDebug() << "Before everything...";
  QApplication* app = new QApplication(argc, argv);
  qDebug() << "QApplication created";
  QPushButton* hello = new QPushButton("Hello World !");
  qDebug() << "QPushButton created";
 
  QObject::connect(hello, SIGNAL(clicked()), app, SLOT(quit()));
  qDebug() << "QObject connected !";
 
  hello->move(50, 50);
  qDebug() << "QPushButton move";
 
  hello->resize(300, 100);
  qDebug() << "QPushButton resize";
 
  hello->show();
  qDebug() << "QPushButton shows up !";
 
  qDebug() << "Before app exec";
  const int ret = app->exec();
  qDebug() << "After app exec";
  delete hello;
  delete app;
  return ret;
}
Une Segmentation fault se produit sur l'instruction hello->show().
Pourtant les dépendances ont été vérifiées (via ldd).
On ne peut que compiler en release, et lorsque je lance gdb depuis la carte sans surprise il m'indique l'erreur de segmentation mais sans symbole donc c'est inexploitable...

Actuellement je recompile Qt au sein de scratchbox en tentant d'utiliser l'option force-pkg-config:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#!/bin/sh                                                                                                                      
 
export TARGET_STAGING_PATH=/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_SYSROOT=$TARGET_STAGING_PATH
 
./configure -v -embedded arm -xplatform qws/linux-arm-gnueabi-g++ \
    -prefix /usr/local/Trolltech/Qt-4.7.0-arm \
    -opensource -little-endian -force-pkg-config \
    -multimedia -glib -phonon -phonon-backend \
    -no-mmx -no-3dnow -no-sse -no-sse2 -no-opengl \
    -nomake demos -nomake example -make tools \
    -no-largefile -no-qt3support -no-gtkstyle -no-cups -no-nis
Si un développeur a déjà cross-compilé une appli du style qmediaplayer sur ARM, un coup de pouce serait vraiment sympa

Désolé d'avoir écrit un aussi long post mais je pense que plus l'on est précis plus la résolution est simple.

Cordialement,