cmake не видит заголовок структуры - PullRequest
1 голос
/ 28 января 2020

У меня есть проект на C ++, который содержит файлы h и cpp. Раньше я строил проект в IDE Netbeans, у него есть собственный Makefile, затем я решил создать проект с помощью cmake. Я оставил только исходный код. У меня также есть внешние каталоги включения в / home / data / lib

Дерево проекта:

.
├── build
├── CMakeLists.txt
├── devices
│   ├── RK.cpp
│   └── RK.h
├── LogWriter
│   ├── LogWriter.cpp
│   └── LogWriter.h
├── main.cpp
└── structs
    └── RK_structs.h

Я создал CMakeLists.txt:

cmake_minimum_required(VERSION 3.2.2)
project(wise_RK)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(SOURCES main.cpp)

include_directories(
    structs
    devices
    LogWriter
    /home/data/lib/wise_versioning
    /home/data/lib/wisenet
    /home/data/lib/wise_log
    /home/data/lib/wise_rs_device
    /home/data/lib/json
)

add_executable(wise_rk ${SOURCES})
add_definitions(-DSOME_IMPORTANT_DEFINITION)

Тогда я сделал это :

mkdir -p build
cd build
cmake ..

-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/anzipex/Downloads/wise_RK/build

Тогда я сделал:

make

Результаты:

[100%] Building CXX object CMakeFiles/wise_rk.dir/main.cpp.o
In file included from /home/awise/Downloads/wise_RK/main.cpp:15:0:
/home/awise/Downloads/wise_RK/devices/RK.h:16:32: fatal error: structs/RK_structs.h: No such file or directory
 #include "structs/RK_structs.h"
                                ^
compilation terminated.
make[2]: *** [CMakeFiles/wise_rk.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/wise_rk.dir/all] Error 2
make: *** [all] Error 2

Что не так?

1 Ответ

2 голосов
/ 28 января 2020

Если вы скажете include_directories(structs) в CMake, это более или менее преобразуется непосредственно в флаг -Istructs вашего компилятора.

Так что #include "RK_structs.h" будет работать с вашим текущим файлом CMake.

Если вы хотите иметь возможность #include "structs/RK_structs.h", вам нужно сделать каталог source включаемым каталогом. Вы можете сделать это явно, указав

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

или неявно, включив флаг CMAKE_INCLUDE_CURRENT_DIR следующим образом:

set(CMAKE_INCLUDE_CURRENT_DIR ON)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...