2017-04-09 2 views
0

J'apprends actuellement CMake et j'essaye de créer mon premier projet de test. Je suis capable de faire fonctionner un projet simple en studio visuel via CMake. Cependant, j'ai du mal à essayer d'ajouter une bibliothèque. J'ai lu quelques guides et des choses mais je continue à obtenir des erreurs. Fondamentalement, j'essaye de relier des bibliothèques de SDL (une bibliothèque de programmation de jeu) dans mon projet d'échantillon. J'ai placé ces bibliothèques dans un dossier de niveau supérieur, "ThirdParty". Voici ce que mon fichier CMakeLists.txt ressemble dans mon répertoire de niveau supérieur:Comment lier correctement mes bibliothèques dans mon projet en utilisant CMake?

cmake_minimum_required(VERSION 2.8.11) 

project(Hello) 

#Find necessary header files 
find_path(SDL_INCLUDE_DIR SDL.h HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/include/) 

#Find necessary library files 
find_library(SDL_LIB_DIR SDL2 HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/lib/x86) 
find_library(SDLMAIN_LIB_DIR SDLmain HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/lib/x86) 

#Add/Link files to project 
include_directories(${SDL_INCLUDE_DIR}) 
target_link_libraries(Test PUBLIC ${SDL_LIB_DIR}) 
target_link_libraries(Test PUBLIC ${SDLMAIN_LIB_DIR}) 



add_executable(Test "${CMAKE_SOURCE_DIR}/Source/Main.cpp") 

Je ne suis pas sûr à 100 pour cent du paramètre HINTS, mais je l'ai vu utilisé sur un autre fil. Quoi qu'il en soit, voici l'erreur que je continue à obtenir:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND. 
Please set them or make sure they are set and tested correctly in the CMake files: 
SDLMAIN_LIB_DIR 
    linked by target "Test" in directory C:/Users/Jason/Desktop/Test 

Qu'est-ce que je fais mal et comment puis-je créer un lien bien des bibliothèques dans CMake?

+0

Comme vous pouvez le voir dans le message d'erreur, le problème n'est pas * avec la bibliothèque * SDLmain, mais avec ** search ** it - c'est find_library() 'qui définit la valeur * NOTFOUND * quand elle ne peut pas trouver la bibliothèque demandée. Voir [cette question] (http://stackoverflow.com/questions/14243524/cmake-find-library-matching-behavior) sur le fonctionnement de 'find_library' et comment trouver votre bibliothèque avec. – Tsyvarev

Répondre

2
  1. En CMake, vous créez d'abord l'exécutable, et puis vous lier à une bibliothèque
  2. Vous devez comprendre comment trouver les bibliothèques et les packages fonctionne dans CMake. Typiquement, la façon dont cela fonctionne est que vous utilisez find_library ou find_package, puis cmake va définir certaines variables que vous pouvez utiliser pour lier à/utiliser la bibliothèque.

Je ne suis pas familier avec SDL, mais googler un peu, je dirais que c'est la façon dont il devrait ressembler à:

find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2) 
find_library(SDL2_LIBRARY NAME SDL2) 
add_executable(MyExec main.cpp) 
target_include_directories(MyExec ${SDL2_INCLUDE_DIR}) 
target_link_libraries(MyExec ${SDL2_LIBRARY}) 

Ce find_library va définir les variables SDL2_INCLUDE_DIR et SDL2_LIBRARY , que vous pouvez utiliser pour lier à SDL et ajouter ses inclusions à votre projet.

+0

Donc, si je suis vos pas et que je sors l'appel de target_link_libraries à SDLmain, je peux faire fonctionner le programme. Cependant, si j'essaie de revenir dans SDLmain, CMake me répète qu'il ne peut pas être trouvé. Le script que j'utilise est le suivant: 'find_library (SDLMAIN_LIB_DIR LIBRARY NAME SDL2main)' et ceci: 'target_link_libraries (Test $ {SDLMAIN_LIB_DIR})'. Fait de la même manière que l'autre bibliothèque de liens. Y a-t-il quelque chose que je fais de mal dans CMake ou est-ce probablement une chose de SDL? – Jason

+0

@Jason Je recommande de commencer par essayer de lier manuellement les bibliothèques SDL, et non par les outils automatisés CMake (comme 'find_library'). Une fois que vous avez réussi, retirez-vous et commencez à utiliser les outils fantaisie de CMake, étape par étape. –

+0

C'est la chose, j'ai et quand je l'ai fait, j'étais capable de deux bibliothèques pour mon programme. CMake ne cesse de me dire que la variable SDLMAIN_LIB_DIR est introuvable. – Jason