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

Systèmes de compilation Discussion :

[CMAKE CPP] Problème de link


Sujet :

Systèmes de compilation

  1. #1
    Membre du Club Avatar de Nanos
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 109
    Points : 50
    Points
    50
    Par défaut [CMAKE CPP] Problème de link
    Salut à tous !

    Aujourd'hui, j'ai un problème. J'ai décidé d'utiliser CMAKE pour mieux gérer mon code source. J'ai créer une bibliothèque qui dépend de la lib SDL et de OpenGL3, quand je compile aucun problème. Mais quand je veux compiler le test de ma bibliothèque, j'obtiens des erreurs de link classique ("undefined reference to SDL_* & gl_*") malgré avoir mis dans le CMakeLists.txt, le répertoire des includes de la SDL et de GL3 ainsi que la localisation de la lib SDL.

    Je pense que j'ai du mal configurer mon CMakeLists.txt mais voilà, c'est la première fois que j'utilise CMAKE et je le connais très peu.

    Tous les fichiers sont sur mon git.
    Mon CMakeLists.txt pour ma lib est à la racine tandis que mon CMakeLists.txt est dans src/Game.

    Petite précision : Le programme de test arrive à linker correctement ma bibliothèque. C'est ma bibliothèque qui n'arrive pas à linker OpenGL & la SDL.

    Pouvez-vous m'aider S.V.P ?

    Merci d'avance...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Dans le CMakeLists.txt à la racine, la commande link_libraries est incorrecte ou je ne connais pas. En tout cas, elle ne fait pas partie des commandes officielles. Je te suggère d'utiliser target_link_libraries.

    Quelques pistes d'amélioration...

    Tu peux utiliser les modules de CMake pour trouver et configurer les librairies externes SDL et OpenGL. Tu peux utiliser au choix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    find_package(OpenGL REQUIRED)
     
    find_package(SDL REQUIRED)
    find_package(SDL_image REQUIRED)
    find_package(SDL_mixer REQUIRED)
    find_package(SDL_net REQUIRED)
    find_package(SDL_sound REQUIRED)
    find_package(SDL_ttf REQUIRED)
    Ces modules définissent différentes variables. Il te suffit de regarder dans la documentation pour savoir lesquelles. J'ai toutefois un doute sur le fait que le module OpenGL recherche GL3.
    http://www.cmake.org/cmake/help/cmak...ule:FindOpenGL
    http://www.cmake.org/cmake/help/cmak...module:FindSDL

    Fais un seul projet CMake en reliant les différents CMakeLists avec add_subdirectory. Ainsi, tu te débarrasseras des link_directories, EXECUTABLE_OUTPUT_PATH et LIBRARY_OUTPUT_PATH qui ne sont pas forcément nécessaires.
    http://www.cmake.org/cmake/help/cmak...d_subdirectory

    A la racine, tu mets un CMakeLists qui positionne le projet, les variables globales, recherche les modules et inclut les sous CMakeLists. Dans src/GameEngine, tu mets un CMakeLists qui crée la librairie. Dans src/Game, tu mets un CMakeLists qui crée l'exécutable. Normalement, ton CMakeList devrait se réduire à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    file(GLOB_RECURSE source_files *)
    add_executable(Game ${source_files})
    target_link_libraries(Game GameEngine)
    GameEngine sera connu à partir du moment où le CMakeLists qui crée la target associée est inclus avant. De plus, cela permet de gérer la transitivité des librairies. En plus clair, il linkera automatiquement l'exécutable contre SDL et OpenGL si tu as indiqué que la librairie devait linker contre SDL et OpenGL.

    Il est déconseillé d'utiliser file(GLOB_RECURSE) pour lister les sources car CMake ne vérifie pas s'il y a des nouvelles sources. Il faut alors forcer l'exécution de CMake et le mieux pour forcer l'exécution automatiquement est encore de lister dans le CMakeList les sources une à une.

  3. #3
    Membre du Club Avatar de Nanos
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 109
    Points : 50
    Points
    50
    Par défaut
    Salut et merci de m'avoir répondu !

    Alors voilà j'ai mis à jour mon git en écoutant tes conseils. Mais je préfère pas utiliser find_package étant donné que j'utilise des lib assez spécifique. Par exemple la version 1.3 de la SDL qui n'est pas encore finis et OpenGL3 et qui en plus ce situe dans /usr/local/ et non dans /usr.

    J'ai décidé de mettre mes includes mes libs dans mon projet directement pour avoir le moins de problèmes possible mais voilà j'ai encore des problèmes lors de la compilation. Regarde le README, tu verras.

    Je crois le problème vient du CMakeLists.txt dans src/GameEngine, au niveau des url relatifs...

    PS : Y'a moyen de faire en sorte de mettre tous mes *.h dans include/ et les *.cpp dans src/ de manière séparé ? Comme sa je n'aurais pas à chaque fois faire des copier-coller des *.h dans le répertoire src/.

    Merci d'avance...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Mais je préfère pas utiliser find_package étant donné que j'utilise des lib assez spécifique. Par exemple la version 1.3 de la SDL qui n'est pas encore finis et OpenGL3 et qui en plus ce situe dans /usr/local/ et non dans /usr.
    Aucune importance pour SDL. Ils ont dû conserver les mêmes headers et le même nom pour la librairie. Tu peux accéder à la version de SDL et stopper la compilation si la version est insuffisante.
    Pour OpenGL3, j'ai un doute sur le module fourni par CMake mais il est toujours possible d'écrire son propre module.
    Aucune importance si la librairie est installée dans /usr, /usr/local ou /tartempion. Tu peux paramétrer les chemins avec la GUI de CMake.

    J'ai décidé de mettre mes includes mes libs dans mon projet directement pour avoir le moins de problèmes possible mais voilà j'ai encore des problèmes lors de la compilation.
    Bof, on est en C++. Si je veux compiler ton projet sur ma machine, il y a de fortes chances que je ne puisse pas car je suis sous Mac ou que ta librairie est en 64 bits alors que je suis en 32 alors que je dispose de ces librairies sur ma machine (mais peut-être pas dans les bonnes versions).

    Regarde le README, tu verras.
    Je vois plusieurs problèmes. Est-ce qu'il ne faut pas que tu linkes contre une autre librairie SDL. Tu ne sembles pas linker contre OpenGL. Il y a des problèmes liés à ton propre code (variables de classes non définies ?). Pour le double main, je ne vois pas comme ça.

    Je crois le problème vient du CMakeLists.txt dans src/GameEngine, au niveau des url relatifs...
    Il manque peut-être un slash. Si tu veux être sûr de ton coup, tu fais make VERBOSE=1. Tu verras la ligne de compilation et tu pourras vérifier que tout est correct.

    Y'a moyen de faire en sorte de mettre tous mes *.h dans include/ et les *.cpp dans src/ de manière séparé ?
    Bien entendu. Tu fais include_directories(include). Tu peux le faire au dessus. La propriété est alors héritée pour tous les CMakeLists inclus par le CMakeList où est fait l'include_directories.

  5. #5
    Membre du Club Avatar de Nanos
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 109
    Points : 50
    Points
    50
    Par défaut
    Merci pour ton aide !

    J'ai plus de problèmes d'includes. Même si y'a des trucs bizarre. La lib d'OpenGL ferait un link vers gl3.h. Sa explique des choses mais pas que sa marche sachant que je l'ai télécharger (gl3.h) sur internet et placer dans /usr/local/include. Mais bon, ok.

    EDIT : J'ai réglé les "undefined references". Mais quelqu'un à une idée pourquoi il me parle de deux fonctions "main" ? J'en ai pourtant qu'un seul.

    EDIT2: Ok j'ai cloner mon git et j'ai pas eu cette erreur. C'est que j'ai du avoir un autre main.cpp en fichier caché, ce que je n'ai pas vu... Donc problème résolu !

    Et merci de votre aide !!!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    C'est que j'ai du avoir un autre main.cpp en fichier caché, ce que je n'ai pas vu...
    De l'intérêt de lister les sources une à une...

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

Discussions similaires

  1. [CMake]Problème de link avec un executable
    Par Anthares dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 18/01/2012, 21h45
  2. Problème de link avec glut et CMake
    Par Ange44 dans le forum C++
    Réponses: 7
    Dernier message: 24/09/2008, 15h33
  3. Problème de linking lors de l'appel d'un .cpp
    Par beegees dans le forum C++
    Réponses: 4
    Dernier message: 31/03/2008, 20h05
  4. Problème de link ODE/OpenGL sous Dev-cpp
    Par Milanber9999 dans le forum ODE
    Réponses: 3
    Dernier message: 09/05/2007, 01h46
  5. Problème de link avec Borland C++ 5.5
    Par gelam dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/11/2003, 16h45

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