Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 3
    Points
    3

    Par défaut Inclusion de bibliothèque

    Bonjour.

    Dans le cadre de mon projet, je doit réutiliser des fonctions matlab dans un code C++ (codé à l'aide de Qt) afin de faire du traitement d'image. J'ai donc utilisé le Matlab Compiler pour générer une bibliothèque (contenant uniquement les fonctions imread, rgb2gray et fft2, c'est juste pour comprendre le fonctionnement de l'utilisation de ce genre de bibliothèque avant d'aller plus loin). Jusque là tout va bien: ma bibliothèque a été générée.
    Je décide donc de l'inclure dans mon fichier .pro dans Qt

    Fichier.pro:
    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
    QT += widgets
     
     
    SOURCES += \
        main.cpp \
        mafenetre.cpp
     
    HEADERS += \
        mafenetre.h
     
    DISTFILES += \
        lena.jpg
     
     
     
    unix|win32: LIBS += -L$$PWD/'../../../../../../Program Files/MATLAB/MATLAB Compiler Runtime/v83/extern/include/' -lmclcommain
     
    INCLUDEPATH += $$PWD/'../../../../../../Program Files/MATLAB/MATLAB Compiler Runtime/v83/extern/include'
    DEPENDPATH += $$PWD/'../../../../../../Program Files/MATLAB/MATLAB Compiler Runtime/v83/extern/include'
     
     
     
    unix|win32: LIBS += -L$$PWD/lib_test_lena/for_testing/ -llib_test_lena
     
    INCLUDEPATH += $$PWD/lib_test_lena/for_testing
    DEPENDPATH += $$PWD/lib_test_lena/for_testing
    Il y a donc la librairie du Matlab Component Runtime et la librairie lib_test_lena que j'ai créée. J'ai ensuite inclus cette librairie dans mafenetre.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "C:/Users\antoi/Documents/STAGE_QUEBEC/test_lena_matlab/lena_librairie_statique_test/for_testing/lena_librairie_statique_test.h"


    C'est à partir de là que j'ai des problèmes:
    En incluant lena_librairie_statique_test.h, j'inclue donc le header mclmcr.h provenant du Matlab Compiler. Et là, je reçoit une longue série d'erreurs, notamment: " 'mxInt64' has not been declared ". Pourtant, cette variable mxInt64 est censée être définie dans ce même fichier mclmcr.h si j'ai bien compris:

    Fichier mclmcr.h:
    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
    33
    34
    35
    36
    #if !defined(__MW_STDINT_H__)
    #  if defined( linux ) || defined( __linux ) || defined( __linux__ )
    #    include <stdint.h>
         typedef int64_t mxInt64;
         typedef uint64_t mxUint64;
    #  elif defined( macintosh ) || defined( __APPLE__ ) || defined( __APPLE_CC__ )
    #    if defined( __GNUC__ )
    #      include <stdint.h>
           typedef int64_t mxInt64;
           typedef uint64_t mxUint64;
    #    endif
    #  elif defined( sun ) || defined( __sun )
    #    include <inttypes.h>
         typedef int64_t mxInt64;
         typedef uint64_t mxUint64;
    #  elif defined( __hpux )
    #    include <inttypes.h>
         typedef int64_t mxInt64;
         typedef uint64_t mxUint64;
    #  elif defined(_MSC_VER)
         typedef __int64 mxInt64;
         typedef unsigned __int64 mxUint64;
    #  elif defined(__BORLANDC__)
         typedef __int64 mxInt64;
         typedef unsigned __int64 mxUint64;
    #  elif defined(__WATCOMC__)
         typedef __int64 mxInt64;
         typedef unsigned __int64 mxUint64;
    #  elif defined(__LCC__)
         typedef __int64 mxInt64;
         typedef unsigned __int64 mxUint64;
    #  endif
    #else
       typedef int64_T mxInt64;
       typedef uint64_T mxUint64;
    #endif
    S'agissant d'un code du Matlab Component Runtime, je n'ai pas la possibilité de le modifier pour chercher la raison de cette erreur.
    Quelqu'un aurait il une idée de la raison qui pourrait provoquer cette erreur ?
    Je pense que le problème doit venir de la manière dont j'ai inclut la librairie ou d'un problème de compatibilité compiler/librairie ou quelque chose dans le genre mais je ne m'y connais pas trop à ce sujet donc j'ai du mal à en savoir plus.
    Pour info, je travaille sous windows 10, avec Qt5.7, mon projet Qt est compilé avec MinGW_32bits. J'ai la version 2014a de Matlab et la version 8.3 du Matlab Compiler (compatible avec Matlab 2014a).
    J'espère avoir bien expliqué ma situation; n'hésitez pas si vous avez besoin de plus de précisions.
    J'offre ma grande vénération à la personne qui arrivera à me sortir de mon impasse

    PS: Ce projet concerne à la fois Matlab et C++ mais comme je pense que l'erreur vient plus de mon code C++ (sous Qt), j'ai jugé plus utile de le mettre dans la rubriaue C++ que Matlab.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 722
    Points : 11 124
    Points
    11 124

    Par défaut

    Vous êtes dans un forum dédié au C++/CLI, une extension du C++ pour le Microsoft .NET Framework, donc c'est pas vraiment le bon forum pour votre question.
    Je pense que le forum lié au C++ "standard" permettrait d'avoir plus de réponses avisées.

    Pourtant, cette variable mxInt64 est censée être définie dans ce même fichier mclmcr.h si j'ai bien compris:
    Oui, mais non, il est défini dans un certain nombre de cas de figure.
    Vous devez vraisemblablement être dans un cas de figure soit non supporté, soit vous avez un problème de configuration de votre environnement.
    Utilisez les options de compilations de votre compilateur pour avoir le résultat du preprocessing des fichiers en erreurs.
    Vous verrez pourquoi la valeur de constantes de compilations qui vous entraine dans un cas non supporté.

    Je pense que le problème doit venir de la manière dont j'ai inclut la librairie ou d'un problème de compatibilité compiler/librairie
    Non, vous n'êtes pas encore à l'édition de lien, vous avez un problème de configuration des constantes de compilation/ environnement non supporté (phase de preprocessing).

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    En effet il s'agit plutôt de C++, je m'en excuse, je n'avais pas saisi la nuance.


    Utilisez les options de compilations de votre compilateur pour avoir le résultat du preprocessing des fichiers en erreurs.
    Vous verrez pourquoi la valeur de constantes de compilations qui vous entraine dans un cas non supporté.
    J'avoue ne pas trop savoir comment on procède pour cela. J'ai des fichiers Makefile.debug et Makefile.Release, ça peut être utile ? J'ai du mal à voir quelle info je dois chercher en fait :/

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 722
    Points : 11 124
    Points
    11 124

    Par défaut

    La définition ou pas de "mxInt64" est conditionné par la valeur de constantes de compilation comme "__MW_STDINT_H__", "linux", "__linux", "__linux__", "macintosh", "__APPLE__", "__APPLE_CC__", "__GNUC__", "sun", "__sun", "__hpux", "_MSC_VER", "__BORLANDC__", "__WATCOMC__", ou encore "__LCC__".

    C'est donc un bon gros bordel.

    Il existe des options du compilateur pour voir le résultat du préprocessing et donc savoir pourquoi la combinaison de constante de compilation de votre projet tombe sur un cas où la définition de "mxInt64" n'est pas ajoutés.
    Les options du compilateur utilisées doivent être spécifiées quelque part dans le makefile et c'est fonction du compilateur utilisé.

    Il y a des constantes de compilation liée à la plateforme cible de la compilation : "linux", "__linux", "__linux__", "macintosh", "__APPLE__", "sun", "__sun", "__hpux".
    Il y a des constantes de compilation liée au compilateur utilisé : "__APPLE_CC__", "__GNUC__", "_MSC_VER", "__BORLANDC__", "__WATCOMC__", ou encore "__LCC__".
    Il y a des constantes de compilation liée au fichier d'en-tête déjà ajouté lors du preprocessing : "__MW_STDINT_H__".

    Il existe des moyens pour définir ces constantes de compilation dans les options du compilateur, mais c'est fonction du compilateur utilisé, et à mettre quelque part dans le Makefile.
    Il arrive assez souvent que la "définition/initialisation" ces constantes soient regroupées dans un fichier d'en-tête à grand renfort de #define.

  5. #5
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2011
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2011
    Messages : 1 040
    Points : 2 583
    Points
    2 583
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Antoine59310 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "C:/Users\antoi/Documents/STAGE_QUEBEC/test_lena_matlab/lena_librairie_statique_test/for_testing/lena_librairie_statique_test.h"
    Il y aurait pas un soucis sur l'include avec le '\' avant "antoi"? à moins que tu sois sous windows je suppose?


    Le seul cas que je vois pour que ton type ne sois pas défini est le suivant:
    Aucun des define n'est définis.

    Je pense que ça doit venir de l'ordre d'include que tu fais. Ou alors l'environnement de build matlab n'est pas le même que Qt, il doit définir des define en plus. Regarde sur internet comment importer un projet matlab dans Qt (ou visual) pour pouvoir trouver la configuration necessaire au bon fonctionnement de la compilation.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


Discussions similaires

  1. Réponses: 0
    Dernier message: 17/08/2015, 12h10
  2. Réponses: 6
    Dernier message: 26/02/2013, 21h00
  3. [Artichow] Inclusion des bibliothèques
    Par Moumoutte dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/10/2009, 12h39
  4. Makefile et inclusion de bibliothèque
    Par taro dans le forum C
    Réponses: 2
    Dernier message: 01/12/2007, 00h55
  5. [Deploiement] Inclusion de bibliothèques tierces
    Par KooKoolen dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 29/01/2007, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo