2017-04-13 934 views
0

我一直在試圖按照供應商的教程在這裏:CMake-Tutorial,看看這裏的文檔:Cmake-Documentation,並儘可能使用YouTube上的來源儘可能地教育自己,但我真的很苦惱建立與OpenGL合作的環境。在修改了Glitter樣板和open.gl和learnopengl.com上的教程之後,我已經決定了解構建過程太重要了,以免調查。CMake無法找到源文件(add_executable)

在我的調查中,我遇到了CMake錯誤「無法找到源文件」,這在下面更詳細地顯示。這個問題似乎來自「add_executable」。

在這裏問了一個類似的問題:CMake - Cannot find file。解決方案涉及確保爲每個變量正確設置$ {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". 

任何及所有的幫助將是非常讚賞。

回答

4

有幾點我想提。

  1. include_directories有助於查找頭文件。源文件必須始終具有完整的相對路徑。

    假設你的main.cpp爲src中,正確的語法是

    add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp) 
    
  2. 包括${PROJECT_BINARY_DIR}沒有意義。

  3. 覆蓋CMake默認變量如${PROJECT_SOURCE_DIR}不是好習慣。將來你會一直記得你已經做了這樣的事情,對於另一個程序員來說,這是非常意外的。

希望它有幫助。

+0

嗨guenni_90,謝謝你的回覆。這確實解決了CMake和「無法找到源文件」錯誤的問題,所以我已經將您的解決方案標記爲已接受。不幸的是,我在運行make後仍然出現錯誤,但在發佈新問題之前,我會嘗試獨立解決此問題。 – assemblyDruid

0

add_executable()呼叫相對路徑是總是解釋相對於變量CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR

如果你在這些目錄的子目錄中的源文件,你應該明確地指定這些子目錄:

add_executable(main src/main.cpp) 

此外,像PROJECT_SOURCE_DIR變量應被視爲只讀:同時改變他們ISN」 CMake發現它是一個錯誤,它打破了一些東西。