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.cpp
和 source/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找不到头文件的主要内容,如果未能解决你的问题,请参考以下文章