CMake找不到头文件

Posted

技术标签:

【中文标题】CMake找不到头文件【英文标题】:CMake can't find header file 【发布时间】:2021-08-03 13:59:58 【问题描述】:

我有一个看起来像这样的项目。

.
├──include
|  └──utilities.hpp
├──source
|  ├──main.cpp
|  └──utilities.cpp
└──CMakeLists.txt

source/main.cppsource/utilities.cpp 都有一个 #include "include/utilities.hpp 指令,CMakeLists.txt 的内容是:

cmake_minimum_required(VERSION 3.16.3)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(search VERSION 1.0.0)


add_executable(
    search
    source/utilities.cpp
    source/main.cpp
    include/utilities.hpp
)
include_directories(search PUBLIC include)

当我运行make VERBOSE+1 时,我得到以下输出:

[ 33%] Building CXX object CMakeFiles/search.dir/source/utilities.cpp.o
/home/mohammed/Work/Projects/search/source/utilities.cpp:1:10: fatal error: include/utilities.hpp: No such file or directory
    1 | #include "include/utilities.hpp"
      |          ^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/search.dir/build.make:63 : CMakeFiles/search.dir/source/utilities.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:76 : CMakeFiles/search.dir/all] Error 2
make: *** [Makefile:84 : all] Error 2

我尝试了this question 的所有答案。但它们都不起作用。

谁能告诉我我做错了什么?

p.s 如果还不清楚,我是 CMake 新手。

【问题讨论】:

在 CMake 中,add_executable 只需要 .cpp 文件。您已添加include/utilities.hpp。这会导致编译器和 CMake 混淆在哪里可以找到该文件。 (不是答案,因为引用的错误消息是由早期编译实用程序.cpp 的问题引起的) 【参考方案1】:

include_directories != target_include_directories。看起来你打算使用后者。

此外,正如 RoQuOTriX 指出的那样:当您将目录添加到包含路径时,包含应该相对于该目录。因此,如果 include 在您的包含路径中,您可能希望使用 #include "utilities.hpp" 而不是 #include "include/utilities.hpp"

【讨论】:

我尝试了include_directories(include)target_include_directories(searchPUBLIC include),结果相似。【参考方案2】:

如果直接指定include_directories(),则不需要在源文件中使用相对路径:

#include "include/utilities.hpp"

改为使用:

#include "utilities.hpp"

如果您想保留相对路径,则需要从 CMakeLists.txt 中删除 include_directories()

include_directories() 告诉编译器应该在哪里搜索包含。

【讨论】:

这确实有效。我不知道我是如何设法错过了这样一个事实,即详细消息是 -I ./include 而不是 -I . 非常感谢。【参考方案3】:

我通过将 CMakeLists.txt 的内容更改为:

cmake_minimum_required(VERSION 3.16.3)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(search VERSION 1.0.0)
set(WORKING_DIRECTORY /home/mohammed/Work/Projects/search)

add_executable(
    search
    $WORKING_DIRECTORY/source/utilities.cpp
    $WORKING_DIRECTORY/source/main.cpp
    $WORKING_DIRECTORY/include/utilities.hpp
)

include_directories($WORKING_DIRECTORY)

非常感谢RoQuOTrix。

【讨论】:

没有必要将 .hpp 文件添加到您的 add_executable 语句中,您应该真的使用 target_include_directories 而不是 include_directories(除了删除 @987654326 @来自你的#include 声明。

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

CMake找不到头文件

cmake找不到头文件

vc++编程找不到头文件。。。急求解决方法。。

[VScode]关于找不到头文件的解决

如何解决gcc编译c程序找不到头文件的问题

关于VC6.0的找不到头文件的问题