2017-03-26 3 views
0

J'essaie de démarrer un projet en utilisant CMake (3.5.2). Pour mon projet, je veux utiliser SDL2. C'est la hiérarchie des dossiers jusqu'à présent.Importer la bibliothèque statique tierce (SDL2) dans CMake

PROJECT 
├── Applications 
├── External 
│   └── SDL2 
├── Games 
├── Libraries 
│ └── Rendering 
└── Tests 
    └── Testen 

La bibliothèque de rendu je travaille a une dépendance à l'égard SDL2 et Testen a une dépendance à l'égard SDL2. J'ai construit SDL2 en tant que bibliothèque statique pour chaque plate-forme et avant que j'essaye d'importer SDL2 à mon projet de CMake, j'avais une application de test basée par console dans un état fonctionnant. Après avoir tenté d'ajouter, je me suis perplexe sur ...

:-1: error: No rule to make target /**FULL_PATH_TO_PROJECT_DIR**/External/SDL2/SDL2-2.0.5/Xcode/SDL/Build/libSDL2.a, needed by `Tests/Testen/Testen.app/Contents/MacOS/Testen'. Stop. 

Voici la liste CMake pour SDL2

SET (SDL2_NAME "External::SDL2") 
SET (SDL2_LIBRARY "***ABSOLUTE_PATH_TO_LIBRARY***") 
SET (SDL2_LIBRARY_DIR "***ABSOLUTE_PATH_TO_LIBRARY_DIR***") 
SET (SDL2_INCLUDE_DIR "***ABSOLUTE_PATH_TO_SDL2_INCLUDES***") 

LINK_DIRECTORIES("${SDL2_LIBRARY_DIR}") 

ADD_LIBRARY ( 
    ${SDL2_NAME} 

    STATIC 
    IMPORTED 
    GLOBAL 
) 

SET_TARGET_PROPERTIES (
    ${SDL2_NAME} 

    PROPERTIES 

    IMPORTED_LOCATION ${SDL2_LIBRARY} 
    LINK_DIRECTORIES ${SDL2_LIBRARY_DIR} 
    INTERFACE_INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} 
) 

Voici la liste CMake pour la bibliothèque wrapper rendu

SET (LIBRARY_NAME Rendering) 

SET ( 
    HEADERS 

    Header1.h 
    Header2.h 
    Header3.h 
    Header4.h 
) 


SET ( 
    SOURCE 

    Source1.cpp 
    Source2.cpp 
    Source3.cpp 
    Source4.cpp 
) 


SET (
    LIB_DEPENDENCIES 

    SomeOtherLibraryWrittenByMe 
) 

LINK_DIRECTORIES("${***ABSOLUTE_PATH_TO_SDL2_LIBRARY_DIR***}") 

ADD_LIBRARY (
    ${LIBRARY_NAME} 

    ${SOURCE} 
    ${HEADERS} 
) 

ADD_DEPENDENCIES (
    ${LIBRARY_NAME} 

    ${LIB_DEPENDENCIES} 
) 

TARGET_LINK_LIBRARIES (
    ${LIBRARY_NAME} 

    ${LIB_DEPENDENCIES} 
    External::SDL2 
) 

Voici la liste CMake pour Testen (mon application de test)

SET (APP_NAME Testen) 
SET (APP_HEADERS ***SAME_STYLE_AS_RENDERING***) 
SET (APP_SOURCE ***SAME_STYLE_AS_RENDERING***) 

LINK_DIRECTORIES("${***ABSOLUTE_PATH_TO_SDL2_LIBRARY_DIR***}") 

# Here we put together our executable 
ADD_EXECUTABLE ( 
    ${APP_NAME} 

    MACOSX_BUNDLE # Because I'm on a mac right now 

    ${APP_HEADERS} 
    ${APP_SOURCE} 
) 


ADD_DEPENDENCIES ( 
    ${APP_NAME} 

    Rendering 
) 

TARGET_LINK_LIBRARIES (
    ${APP_NAME} 

    Rendering 
) 

Le but de mon projet est de mieux comprendre les différents aspects de la programmation. Cela dit, j'évite activement d'utiliser des scripts auxiliaires tels que FindSDL2.cmake et d'autres modules similaires. Peut-être que c'est peut-être l'outil dont j'ai besoin pour résoudre mon problème, mais j'aimerais savoir exactement ce qu'il fait si jamais je tente d'ajouter quelque chose à mon projet qui n'a pas de script Find.cmake, je ne suis pas bloqué.

+0

Le chemin dans le message d'erreur est celui que vous attribuez à * IMPORTED_LOCATION * pour la bibliothèque SDL2. Si vous voulez lier votre bibliothèque avec SDL2 et supprimer SDL2, faites ce lien comme * PRIVATE *, donc il ne sera pas propagé à l'exécutable. – Tsyvarev

+0

@Tsyvarev J'ai changé TARGET_LINK_LIBRARIES dans la bibliothèque Rendering pour lier SDL2 en privé, mais tout ce qui semblait être de déplacer l'erreur de Testen vers Rendering. – UebelAndre

Répondre

0

Je suis gêné de dire que mon problème était le résultat d'une faute de frappe dans le chemin libSDL2.a. Cependant, @Tsyvarev a fait ressortir un bon point que je devrais relier SDL2 comme PRIVATE. J'essaie actuellement de résoudre les erreurs d'éditeur de liens dans SDL2 liées aux appels de fonctions dans la bibliothèque vers les fonctions du framework MACOSX. Je peux poster une question à ce sujet aussi bien que j'essaierai de déboguer ceci pendant un moment.

Merci à tous ceux qui ont pensé à ça! merci à @Tsyvarev :)

modifier - Je résolus les erreurs de l'éditeur de liens en liant les cadres contre mon exécutable. Tout est de retour à