web-dev-qa-db-ja.com

CMakeがソースファイルを見つけることができません(add_executable)

私はここでベンダーのチュートリアルを実行しようとしています: CMake-Tutorial 、ここでドキュメントを確認します: Cmake-Documentation 、そしてYouTubeのソースを可能な限り活用してくださいですが、OpenGLを使用するための環境設定に本当に苦労しています。 Glitterボイラープレートとopen.glとlearnopengl.comのチュートリアルをいじってみた結果、ビルドプロセスを理解することは重要なので、調査しないようにしました。

私の調査では、以下に詳細を示すCMakeエラー「ソースファイルが見つかりません」に遭遇しました。問題は「add_executable」に起因しているようです。

同様の質問がここで尋ねられました: CMake-ファイルが見つかりません 。解決策には、各変数に対して$ {PROJECT_SOURCE_DIR}が適切に設定されていることを確認することが含まれていました。

私のファイル構造:

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

私の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)

次のエラーが表示されます。

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".

すべての助けをいただければ幸いです。

10
assemblyDruid

私が言及したい点がいくつかあります。

  1. include_directoriesは、ヘッダーファイルの検索に役立ちます。ソースファイルには常に完全な相対パスが必要です。

    Main.cppがsrc内にあると仮定すると、正しい構文は次のとおりです。

    add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp)
    
  2. ${PROJECT_BINARY_DIR}を含めても意味がありません。

  3. ${PROJECT_SOURCE_DIR}などのCMakeのデフォルト変数を上書きすることはお勧めできません。将来、あなたはいつもあなたがそのようなことをしたことを覚えているでしょう、そして他のプログラマーにとってそれは全く予想外です。

それが役に立てば幸い。

19
guenni_90

add_executable()呼び出しでは、相対パスはalways変数CMAKE_CURRENT_SOURCE_DIRまたはCMAKE_CURRENT_BINARY_DIRに関連して解釈されます。

これらのディレクトリのサブディレクトリにソースファイルがある場合は、これらのサブディレクトリを明示的に指定する必要があります。

add_executable(main src/main.cpp)

また、PROJECT_SOURCE_DIRのような変数はreadonlyとして扱う必要があります。それらを変更すると、CMakeによってエラーとして検出されず、いくつかの問題が発生します。

5
Tsyvarev