Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.8.0 - Qt Creator : 4.3.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Compiler une application Qt4 sur Mac OS X

Bonjour,

Pour une fois, c'est moi qui à besoin d'aide.

Suite à une demande de déploiement sur MacOS, je souhaite donc compiler sur cet OS une application Qt 4.8.5 déjà fonctionnelle sur windows.
Ne connaissant pas cet OS, me voila donc lancé dans dans la découverte de ce dernier. Pour l'instant, je vous passe mon avis préliminaire sur l'OS de la pomme.
Donc :
* j'ai installé Xcode
* puis j'ai installé le SDK Qt5.7 online
Résultat, les applications exemples de Qt5.7 fonctionnent. Jusqu'ici tout va bien.

Mais mon application est en Qt 4.8.5.
De plus, j'ai sous la main un OS X El Capitan 10.11.6

Première méthode testé, l'installation du fichier qt-mac-opensource-4.8.5.dmg.
Sauf qu'un message m'indique que ce paquet n'est pas compatible avec cette version d'OS X. Et risque d'endomagement du système. Inquiètant. Je n'est donc pas insisté dans cette voie pour l'instant.

Deuxième méthode testé, compiler Qt4.8.5.
Alors je télécharge qt-evrerywhere-opensource-src-4.8.5.
Un coups de ./configure de la lib.
Et là, même problème. Un warning "This version of Mac OS is unsupported"
Et forcement la compilation échoue.

Alors comment faire pour compiler une application Qt4 sur Mac OS X ?

Réponses

  • Hello,

    Qt 4 n'est pas officiellement supporté sur macOS 10.11, le seul moyen de l'avoir dans ce cas est de le compiler, mais sans certitudes que ça fonctionne. Il y a probablement des patchs à appliquer et des modules incompatibles à enlever du build (WebKit, Phonon et autres).

    Si Qt 4.8.7 pourrait convenir, tu peux l'installer via Homebrew (brew install qt, brew info qt pour connaitre la version).
  • slt,
    Ok, merci. La compilation fonctionne en Qt 4.8.7 maintenant.
    Du coups, avant la compilation sur mac, j'ai voulu le faire sur windows en version 4.8.7. Et la c'est le drame.

    Bon sinon pour conclure, existe-il un tableau indiquant quelle version de Qt est compatible avec quelle version de OS X ? Car c'est vraiment le flou de ce côté là. Car si j'arrive à compiler mon projet en Qt 4.8.7, quelles sont les versions de OS X où mon programme pourrait être distribuée ?
  • Il y a une page pour chaque version de Qt avec les détails sur le support officiel des plateformes (pour les autres il faut recompiler et tester).
    Mais pas de page avec toutes les versions à ma connaissance.

    Qt 4.8, c'est Snow Léopard et Lion (Mac OS X 10.6, 10.7) http://doc.qt.io/qt-4.8/supported-platforms.html
    Qt 5.6, 10.8 à 10.11 (Mountain Lion - El Capitan) http://doc.qt.io/qt-5/supported-platforms-and-configurations.html

  • Slt,

    Merci pour l'info.
    Je galère vraiment sur cet OS.

    Alors j'arrive à compiler un projet vide sur en Qt 4.8.7 sur mac. Mais pas mon projet.
    Donc comme mon projet utilise une lib externe qui est qserialdevice, je cherche donc a faire fonctionner les examples de base fournis avec cette lib.

    Je commence à compiler les sources de la lib. OK, pas de message d'erreur.
    Ensuite je compile un exemple fourni nommé sreader.pro. Cela compile et s'exécute. Parfait.
    Mais ensuite je compile un autre exemple fourni nommé enumerator.pro.
    Et là j'ai 1 warning et qui me semble important:
    :-1: avertissement : libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9
    et 2 messages d'erreurs :
    :-1: erreur : linker command failed with exit code 1 (use -v to see invocation)
    :-1: erreur : [release/enumerator.app/Contents/MacOS/enumerator] Error 1
    Donc comme je suis discipliné, je suis le conseil du warning et j'ajoute dans le .pro de la lib ainsi que dans celui de l'exemple ceci :
    QMAKE_CXXFLAGS += -stdlib=libc++
    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9
    Ce qui me supprime bien le warning mais pas les 2 erreurs.

    Et là je bloque. voici le message d'erreur :
    12:27:47: Débute : "/usr/bin/make" 
    /usr/local/Cellar/qt/4.8.7_2/bin/qmake -spec /usr/local/Cellar/qt/4.8.7_2/mkspecs/unsupported/macx-clang CONFIG+=x86_64 -o Makefile enumerator.pro
    clang++ -headerpad_max_install_names -arch x86_64 -o release/enumerator.app/Contents/MacOS/enumerator obj/main.o obj/enumerator.o obj/moc_enumerator.o -F/usr/local/Cellar/qt/4.8.7_2/lib -L../../src/build/release -L/usr/local/Cellar/qt/4.8.7_2/lib -lqserialdevice -framework QtCore -L/usr/local/opt/openssl/lib -L/usr/local/Cellar/qt/4.8.7_2/lib
    Undefined symbols for architecture x86_64:
    "_CFDictionaryAddValue", referenced from:
    SerialDeviceEnumeratorPrivate::SerialDeviceEnumeratorPrivate() in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_CFNumberGetValue", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_CFRelease", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_CFRetain", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_CFRunLoopAddSource", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_CFRunLoopGetCurrent", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_CFStringGetCString", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IOIteratorNext", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IOMasterPort", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IONotificationPortCreate", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IONotificationPortGetRunLoopSource", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IOObjectRelease", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IORegistryEntryCreateCFProperty", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IORegistryEntryGetParentEntry", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IORegistryEntrySearchCFProperty", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IOServiceAddMatchingNotification", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IOServiceGetMatchingServices", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_IOServiceMatching", referenced from:
    SerialDeviceEnumeratorPrivate::SerialDeviceEnumeratorPrivate() in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "___CFConstantStringClassReference", referenced from:
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    CFString in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    ...
    "_kCFAllocatorDefault", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_kCFRunLoopDefaultMode", referenced from:
    SerialDeviceEnumeratorPrivate::setEnabled(bool) in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    "_kIOMasterPortDefault", referenced from:
    SerialDeviceEnumeratorPrivate::updateInfo() const in libqserialdevice.a(serialdeviceenumerator_p_mac.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make: *** [release/enumerator.app/Contents/MacOS/enumerator] Error 1
    12:27:48: Le processus "/usr/bin/make" s'est terminé avec le code 2.
    Erreur lors de la compilation/déploiement du projet enumerator (kit : Desktop Qt 4.8.7 clang 64bit)
    When executing step "Make"/code>
    Là je sèche. Quelqu'un aurait une piste ?
  • Hello,

    Quelle idée d'utiliser un Qt aussi vieux aussi ;-)

    QSerialDevice a été compilé en static ?

    Il semblerait qu'il manque des frameworks, essaye en ajoutant ceci au .pro de ton projet :
    LIBS += -framework IOKit -framework CoreFoundation
  • Ok, je vois.
    Il faut s'accrocher pour associer par exemple _CFDictionaryAddValue à CoreFoundation vu la doc d'apple.
    Merci, ça compile et mon projet s'exécute.
    Malheureusement, la lib qserialdevice ne fonctionne pas complètement. Car pas d’énumération des port séries.
    Alors j'avais vu que la lib QSerialPort a une branche Qt4. Je l'ai testé avec ces projets exemples et elle fonctionne.
    Donc je me suis dit que j'allais remplacer la partie qui ne fonctionne pas de qserialdevice par l'énumération de QSerialPort.
    Malheureusement les 2 lib semblent rentrer en confit.
    Je crois que je n'aurai pas le choix. Il faudra passer complètement à QSerialPort.
    Merci en tout cas.
  • CF signifie CoreFoundation en fait ;-) NS pour NextStep, IO pour IOKit, etc...

    Ça fait un moment que j'utilise QSerialPort et ça a toujours plutôt bien marché, sauf dernièrement où j'ai dû corriger un bug sur MacOS, mais je ne me rappelle plus quoi exactement...
Connectez-vous ou Inscrivez-vous pour répondre.