IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++ Discussion :

VS2010 et GSL : Problème d'édition de lien.


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 24
    Points
    24
    Par défaut VS2010 et GSL : Problème d'édition de lien.
    Bonjour,

    Je suis nouveau sur ce forum, c'est mon premier post. Je pense qu'il s'agit avant tout d'un manque de connaissance des mécanismes de linkage. Je ne suis pas certain d'être dans la bonne section. Aussi, si je me suis perdu, dites le moi, je me déplacerai

    ALors voila, j'ai un problème d'édition de lien à la compilation d'un projet Visual Studio 2010 qui utilise GSL 1.8 sur Windows 7 64 bits (edi, lib et platform immuables en raisons de contraintes externes).

    J'ai googlé, cherché dans les différents forum, lu la doc officielle, les différents howto que l'on peut trouver, impasse. Au. se. cours.

    extrait de l'erreur (même erreur pour autres symbol) :
    [...] error LNK2019: unresolved external symbol gsl_odeiv_step_free referenced in function "public: class std::vector<double,class std::allocator<double> > __cdecl [...]


    Contexte :
    Le projet Visual est généré via CMake, en utilisant un FindGSL.cmake non-officiel que l'on peut facilement googler. J'ai bien l'impression qu'il fonctionne bien (pas d'erreur, et fichiers .lib déterminés).
    J'ai généré ces ".lib" à partir des fichiers sources officiels de GSL 1.8 (Release et Static Lib).

    J'ai récupéré les fichiers de développeurs, qui sont le suivants :
    - libgsl.a
    - libgsl.def
    - libgsl.dll.a

    Ce même projet tourne impeccablement sous Linux (GSL dans un environnement UNIX, rien de bien étonnant).

    piste
    Je pense que je fais une mauvaise utilisation de ces derniers fichiers.
    Je me doute du rôle du .def, à partir du moment ou tous les symbols externes non résolus sont définies en commençant par "GSL_EXPORT ma fonc", et que ce fichier en contiens les exports, nécessaire aux compilateurs non GNU. Cependant, je ne sais pas où se trouve sa place.. Quand aux ".a", il me semble que c'est équivalent d'utiliser les .a ou .lib, s'ils sont compatibles (d'ailleurs, je tombe exactement sur les mêmes erreurs).

    Je ne sais pas comment me servir du fichier ".def". J'ai essayé de le passer au /DEF (fichier de definition de module). Je suis à cours d'idée. HELP.

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Hello !

    Peut-on voir ton CMakeLists.txt ?

    Citation Envoyé par eti_nne Voir le message
    J'ai récupéré les fichiers de développeurs, qui sont le suivants :
    - libgsl.a
    - libgsl.def
    - libgsl.dll.a
    Comment as-tu référencé ces fichiers dans le cache de CMake ?
    Es-tu bien sûr d'avoir récupéré la version 64 bits ?
    Es-tu bien sûr d'avoir ciblé la plateforme 64 bits dans la config de CMake ?

    Es-tu bien sûr d'avoir le compilo Microsoft version 64bits ? Selon la version de Visual Studio que tu utilises, il n'est pas nécessairement installé par défaut, quand bien même ton Windows serait en 64 bits.

    Je pense que tout ça doit pouvoir se régler par un petit coup d'"edit cache" de CMake bien senti. Peut-être faudra-t-il rajouter une variable utilisateur à modifier dans le cache pour pointer les fameux fichiers.
    Find me on github

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Comment as-tu référencé ces fichiers dans le cache de CMake ?
    Justement, je ne l'ai pas fait. Et ne sais pas comment le faire. Même en customisant le projet VS obtenu, je n'y arrive pas.

    Citation Envoyé par jblecanard Voir le message
    Es-tu bien sûr d'avoir récupéré la version 64 bits ?
    Absolument pas (donc c'est plutôt le contraire). C'est pourquoi je compile moi-même les libs. Le .def est une description, au format texte (indépendantes de la valeur de bitness). Grosso modo, au lieu d'utiliser les .a que j'ai trouvé, j'utilise les .lib. Et je garde le .def, sans vraiment m'en servir.

    Citation Envoyé par jblecanard Voir le message
    Es-tu bien sûr d'avoir ciblé la plateforme 64 bits dans la config de CMake ?
    J'appelle le générateur "Visual Studio 10 Win64". Générateur qui a fait ses preuves dans d'autres projets.

    Citation Envoyé par jblecanard Voir le message
    Es-tu bien sûr d'avoir le compilo Microsoft version 64bits ? Selon la version de Visual Studio que tu utilises, il n'est pas nécessairement installé par défaut, quand bien même ton Windows serait en 64 bits.
    J'ai VS2010 Ultimate Edition version 64 bits.
    J'ai déjà utilisé la colonne vertébrale du cmake pour d'autres projet, et cela fonctionnait très bien : je pense que c'est propre à gsl.
    De plus, je compile les .lib que j'utilise (si 32, 32 partout).

    Citation Envoyé par jblecanard Voir le message
    Je pense que tout ça doit pouvoir se régler par un petit coup d'"edit cache" de CMake bien senti. Peut-être faudra-t-il rajouter une variable utilisateur à modifier dans le cache pour pointer les fameux fichiers.
    Je croise les doigts. Je pense aussi qu'il faut "simplement" donner l'emplacement des fichiers, et indquer l'usage que l'on en aura. Mais je suis dans le brouillard à partir de la.

    Mon CMake n'a rien d'extraordinaire :

    Du côté find_package :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    LIST(APPEND CMAKE_MODULE_PATH ${GLOB_CMAKE_DIR})
     
    find_package( GSL REQUIRED )
    if(GSL_FOUND)
        message("GSL Found !")
    endif(GSL_FOUND)
    Du côté includes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include_directories(${GSL_INCLUDE_DIRS})
    Du côté target_link_libraries :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    add_executable(${BIN_NAME} ${SRC_FILES})
    target_link_libraries(${BIN_NAME} ${GSL_LIBRARIES})
    Du côté FindGSL.cmake
    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
     
    IF(WIN32)
      # JW tested with gsl-1.8, Windows XP, MSVS 7.1, MSVS 8.0
      SET(GSL_POSSIBLE_ROOT_DIRS
        ${GSL_ROOT_DIR}
        $ENV{GSL_ROOT_DIR}
        ${GSL_DIR}
        ${GSL_HOME}
        $ENV{GSL_DIR}
        $ENV{GSL_HOME}
        $ENV{EXTERN_LIBS_DIR}/gsl
        $ENV{EXTRA}
        )
     
      FIND_PATH(GSL_INCLUDE_DIRS
        NAMES gsl/gsl_cdf.h gsl/gsl_randist.h
        PATHS ${GSL_POSSIBLE_ROOT_DIRS}
        PATH_SUFFIXES include
        DOC "GSL header include dir"
        )
     
      FIND_LIBRARY(GSL_GSL_LIBRARY
        NAMES gsl libgsl
        PATHS ${GSL_POSSIBLE_ROOT_DIRS}
        PATH_SUFFIXES lib
        DOC "GSL library dir" )
     
      FIND_LIBRARY(GSL_GSLCBLAS_LIBRARY
        NAMES gslcblas libgslcblas
        PATHS ${GSL_POSSIBLE_ROOT_DIRS}
        PATH_SUFFIXES lib
        DOC "GSL cblas library dir" )
     
      SET(GSL_LIBRARIES ${GSL_GSL_LIBRARY} ${GSL_GSLCBLAS_LIBRARY} )

    En espérant que ça t'inspire !

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Re

    Et donc il trouve bien tes *.libs et t'affiche le message "GSL Found !" ?

    Sous windows, j'ai souvent eu à bricoler le CMake pour lui faire trouver les libs. Tu peux tester la technique suivante: juste avant la directive add_executable, tu rajoutes la ligne suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    link_directories(${GSL_LIBRARY_PATH});
    Ensuite tu fais un edit cache et tu rajoutes cette variable à la main dans la liste, tu la mets de type "path" et tu la fais pointer vers le dossier ou il y a tes *.libs.
    Find me on github

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par jblecanard Voir le message

    Et donc il trouve bien tes *.libs et t'affiche le message "GSL Found !" ?

    Sous windows, j'ai souvent eu à bricoler le CMake pour lui faire trouver les libs. Tu peux tester la technique suivante: juste avant la directive add_executable, tu rajoutes la ligne suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    link_directories(${GSL_LIBRARY_PATH});
    Ensuite tu fais un edit cache et tu rajoutes cette variable à la main dans la liste, tu la mets de type "path" et tu la fais pointer vers le dossier ou il y a tes *.libs.
    Yes, moi aussi j'ai du pas mal bricoler parfois. Le problème est ici que les libs sont trouvées, linkées, et que c'est insuffisant.

    Dans le header gsl, les méthodes sont déterminés avec la macro suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GSL_EXPORT gsl_odeiv_control * gsl_odeiv_control_alloc(const gsl_odeiv_control_type * T);
    Et que je ne trouve pas la définition de cette macro. Mais elle a certainement un sens. Je pense qu'elle fait le ___cdecl. Et le fait que les fichiers pour développeur soient fournies un .def, cela renforce le sentiment d'un chainon manquant.

    Mais sinon, le mécanisme "classique" fonctionne très bien. Je trouve mes .lib, je crée la dépendance. Et hop, il manque des infos. Et hop, je ne sais pas comment faire.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    J'ai un petit peu honte. Mais jute un petit peu. Non, en fait, beaucoup.

    J'ai eu comme un doute, après ce que tu m'as dit. J'ai vérifié que je généré bien les lib x64 de GSL.. Bingo. C'était les 32 bits. Désolé pour ça. C'est.. Je.. Désolé pour ça.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    ca arrive, et grace à ce passage par le forum, tu seras méfiant pour les prochaines fois…
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    T'inquiètes les erreurs à la con du genre, tu n'as pas fini d'en faire dans ta vie de développeur... faut accepter le destin, on ne peut pas y échapper
    Find me on github

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MASM32] Problème à l'édition de liens
    Par theShin dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 01/03/2007, 21h38
  2. Problème d'édition de lien
    Par Kodamas dans le forum Autres éditeurs
    Réponses: 10
    Dernier message: 05/06/2006, 13h50
  3. [g++] Problème d'édition de liens
    Par glKabuto dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 31/05/2006, 19h10
  4. [Dev-C++] Problème d'édition des liens
    Par shura dans le forum EDI
    Réponses: 5
    Dernier message: 30/08/2005, 09h35
  5. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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