CMake 找不到源文件(add_executable)

Posted

技术标签:

【中文标题】CMake 找不到源文件(add_executable)【英文标题】:CMake cannot find source file (add_executable) 【发布时间】:2017-04-13 19:39:52 【问题描述】:

我一直在尝试遵循供应商的教程:CMake-Tutorial,查看这里的文档:Cmake-Documentation,并通过 YouTube 上的资源尽可能地自我教育,但我真的很难设置环境准备使用 OpenGL。在修改了 Glitter 样板和 open.gl 和 learnopengl.com 上的教程后,我决定了解构建过程非常重要,不去研究。

在我的调查中,我遇到了 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".

我们将不胜感激。

【问题讨论】:

【参考方案1】:

有几点我想提一下。

    include_directories 帮助查找头文件。源文件必须始终具有完整的相对路径。

    假设你的 main.cpp 在 src 中,正确的语法是

    add_executable(main $PROJECT_SOURCE_DIR/main.cpp)
    

    包含$PROJECT_BINARY_DIR 没有意义。

    覆盖像$PROJECT_SOURCE_DIR 这样的CMake 默认变量不是好的做法。以后你会永远记得你做过这样的事情,而对于另一个程序员来说,这是完全出乎意料的。

希望对你有帮助。

【讨论】:

您好 guenni_90,感谢您的回复。这确实解决了 CMake 的问题和“找不到源文件”错误,因此我已将您的解决方案标记为已接受。不幸的是,运行 make 后我仍然遇到错误,但我会在发布新问题之前尝试独立解决这个问题。【参考方案2】:

add_executable() 调用中,相对路径总是相对于变量CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR 进行解释。

如果您在这些目录的子目录中有源文件,您应该明确指定这些子目录:

add_executable(main src/main.cpp)

另外,像PROJECT_SOURCE_DIR 这样的变量应该被视为只读:虽然更改它们不会被 CMake 检测为错误,但它会破坏一些东西。

【讨论】:

【参考方案3】:

就我而言,我在 vscode 中使用 esp-idf。原来,将 main.c 重命名为 main.cpp 后,vscode 进入 cmakelists.txt 文件并添加 main.cpp 作为源,但无法删除 main.c。因此,构建继续不必要地寻找不再存在的文件。

【讨论】:

以上是关于CMake 找不到源文件(add_executable)的主要内容,如果未能解决你的问题,请参考以下文章

cmake找不到pdal的配置文件

CMake 找不到源文件,即使它位于正确的位置 [关闭]

CMake 找不到源文件(add_executable)

cmake 找不到“OPENCV”提供的包配置文件

CMake笔记

CMake 问题 - 找不到“OpenCV”提供的包配置文件