web-dev-qa-db-fra.com

CMake ne peut pas trouver le fichier source (add_executable)

J'ai essayé de suivre le tutoriel du vendeur ici: CMake-Tutorial , regardez la documentation ici: Cmake-Documentation , et renseignez-vous le mieux possible avec les sources sur YouTube , mais j'ai vraiment du mal à configurer l'environnement pour pouvoir travailler avec OpenGL. Après avoir bricolé le passe-partout Glitter et les tutoriels sur open.gl et learnopengl.com, j'ai décidé que la compréhension du processus de construction est trop importante pour ne pas enquêter.

Dans mon enquête, je suis tombé sur l'erreur CMake "ne peut pas trouver le fichier source" qui est montré ci-dessous plus en détail. Le problème semble provenir de "add_executable".

Une question similaire a été posée ici: CMake - Impossible de trouver le fichier . La solution consistait à s'assurer que $ {PROJECT_SOURCE_DIR} était correctement défini pour chaque variable, ce que je pense avoir fait.

Ma structure de fichiers:

+ infuriating_project
    + bin // post compile results
    + src // my humble code
    + deps // external code
        +glew
            + include
            + src
        +glfw
            + include
            + src
        +glm
        +soil
            + lib
            + src

Mes CMakeLists.txt:

cmake_minimum_required (VERSION 3.0)


# Version Information ---------------------------------------------------------
project (openGL-practice)
SET (VERSION_MAJOR 1)
SET (VERSION_MINOR 0)
SET (VERSION_FEATURE 0)
SET (VERSION_PATCH 0)
SET (VERSION "${VERSION_MAJOR}.${VERSION_MINOR}")
SET (VERSION "${VERSION}.${VERSION_FEATURE}.${VERSION_PATCH}")
MESSAGE ("Version: ${VERSION}")

# Configure Source & Binary Directories ---------------------------------------
SET (PROJECT_ROOT "${PROJECT_SOURCE_DIR}")
SET (PROJECT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/src")
SET (PROJECT_BINARY_DIR "${PROJECT_BINARY_DIR}/bin")
MESSAGE ("Source path: ${PROJECT_SOURCE_DIR}")
MESSAGE ("Binary path: ${PROJECT_BINARY_DIR}")

# Configure Depenency Directories ---------------------------------------------
SET (PROJECT_DEPS "${PROJECT_ROOT}/deps")
SET (glew_inc "${PROJECT_DEPS}/glew/include/GL/")
SET (glew_src "${PROJECT_DEPS}/glew/src/")
SET (glfw_inc "${PROJECT_DEPS}/glfw/include/GLFW/")
SET (glfw_src "${PROJECT_DEPS}/glfw/src/")
SET (glm "${PROJECT_DEPS}/glm/glm/")
SET (soil_lib "${PROJECT_DEPS}/lib/")
SET (soil_src "${PROJECT_DEPS}/src/")

# Include directories ---------------------------------------------------------
include_directories("
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_BINARY_DIR}
    ${glew_inc}
    ${glew_src}
    ${glfw_inc}
    ${glfw_src}
    ${glm}
    ${soil_lib}
    ${soil_src}
    ${PROJECT_ROOT}
    ")

# Add executable --------------------------------------------------------------
add_executable(main main.cpp)

L'erreur suivante est fournie:

CMake Error at CMakeLists.txt:46 (add_executable):
  Cannot find source file:

    main.cpp

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error: CMake can not determine linker language for target: main
CMake Error: Cannot determine link language for target "main".

Toute aide serait très appréciée.

10
assemblyDruid

Il y a certains points que je voudrais mentionner.

  1. include_directories aide à trouver les fichiers d'en-tête. Les fichiers source doivent toujours avoir un chemin relatif complet.

    En supposant que votre main.cpp se trouve dans src, la syntaxe correcte est

    add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp)
    
  2. Comprenant ${PROJECT_BINARY_DIR} n'a pas de sens.

  3. Écraser les variables par défaut de CMake comme ${PROJECT_SOURCE_DIR} n'est pas une bonne pratique. À l'avenir, vous vous souviendrez toujours que vous avez fait une telle chose et pour un autre programmeur, c'est assez inattendu.

J'espère que ça aide.

19
guenni_90

Dans add_executable() les chemins relatifs d'appel sont toujours interprétés par rapport aux variables CMAKE_CURRENT_SOURCE_DIR ou CMAKE_CURRENT_BINARY_DIR.

Si vous avez des fichiers source dans les sous-répertoires de ces répertoires, vous devez spécifier explicitement ces sous-répertoires:

add_executable(main src/main.cpp)

En outre, des variables comme PROJECT_SOURCE_DIR doit être traité comme en lecture seule: bien que les modifier ne soit pas détecté par CMake comme une erreur, il casse certaines choses.

5
Tsyvarev