I'm working on a C++ project using ccls
(the LSP language server) and lsp-mode
in Emacs. I also have a CMake project definition for my project. My project builds correctly with make
using the Makefile
generated by CMake, but ccls
says that my #include
is not found.
Here's the project structure:
+ CMakeLists.txt
+ main.cpp
+ src/
|\
| + SomeClass.cpp
| + SomeClass.hpp
The CMakeLists.txt
file looks like this:
cmake_minimum_required(VERSION 3.22)
project(includefail)
set(simple_VERSION_MAJOR 0)
set(simple_VERSION_MINOR 1)
add_executable(
includefail
${CMAKE_SOURCE_DIR}/main.cpp
${CMAKE_SOURCE_DIR}/src/SomeClass.cpp
)
target_include_directories(
includefail PRIVATE
${CMAKE_SOURCE_DIR}/src
)
This generates the following compile_commands.json
(which is what ccls
uses):
[
{
"directory": "/home/user/code/c/include-fail/build",
"command": "/usr/bin/c++ -I/home/user/code/c/include-fail/src -o CMakeFiles/includefail.dir/main.cpp.o -c /home/user/code/c/include-fail/main.cpp",
"file": "/home/user/code/c/include-fail/main.cpp"
},
{
"directory": "/home/user/code/c/include-fail/build",
"command": "/usr/bin/c++ -I/home/user/code/c/include-fail/src -o CMakeFiles/includefail.dir/src/SomeClass.cpp.o -c /home/user/code/c/include-fail/src/SomeClass.cpp",
"file": "/home/user/code/c/include-fail/src/SomeClass.cpp"
}
]
src/SomeClass.hpp
looks like this:
class SomeClass {
public:
SomeClass();
private:
int x;
};
src/SomeClass.hpp
looks like this:
#include "SomeClass.hpp"
SomeClass::SomeClass() {
x = 1;
}
And main.cpp
looks like this:
#include "SomeClass.hpp"
int main(int argc, char* arv[]) {
SomeClass sc = SomeClass();
return 0;
}
It's in main.cpp
where I get the error from LSP. It says 'SomeClass.hpp' file not found
.
So why is ccls
not able to find this include?