CMakelists.txt; файл заголовка вложенной папки Не найден ошибка

У меня следующая структура папок:

demo_main
|
|---- demo_use
|       |
|        --- demo_use_main.c
 ---- demo_1.0
        |
         --- demo_sample
                |
                 ---zmq_sample
                       |
                        --- HelloWorld.h
                        --- HelloWorld.cpp

В файле demo_main\demo_use\demo_use_main.c мне нужно вызвать функцию, определенную в HelloWorld.cpp, расположенную в другой папке.

demo_use_main.c
    #include "HelloWorld.h"

    ...
    int main(int argc, char *argv[])
    {
        ...
        HelloWorldPrint();
        return 0;
    }

HelloWorld.h
    void HelloWorldPrint(void);

HelloWorld.cpp
    #include<iostream>
    #include "HelloWorld.h"

    void HelloWorldPrint()
    {
       std::cout << "function Hello World!" << std::endl;    
    }

Но при компиляции выдает ошибку:

demo_use_main.c:4:10: fatal error: HelloWorld.h: No such file or directory

Мой Cmakelists.txt выглядит так:

demo_main\CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
        add_subdirectory(demo_use)
        add_subdirectory(demo_1.0)


demo_main\demo_use\CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
    include_directories(${CMAKE_CURRENT_LIST_DIR}/../demo_1.0/demo_sample/zmq_sample/)

    add_sources(
        ${CMAKE_CURRENT_LIST_DIR}/demo_use_main.c
        ...
    )


demo_main\demo_1.0\CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
        add_subdirectory(demo_sample)


demo_main\demo_1.0\demo_sample\CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
        add_subdirectory(zmq_sample)


demo_main\demo_1.0\demo_sample\zmq_sample\CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
    project (zmq_demo)
    add_sources(${CMAKE_CURRENT_LIST_DIR}/HelloWorld.cpp)
    add_executable(${PROJECT_NAME} HelloWorld.cpp)

Что не хватает, что файл заголовка не найден demo_use_main.c? Как это исправить?

1 ответ

Как указано в комментариях, заголовок не найден, потому что include_directoriesвызов применяется только к целям, определенным в текущем каталоге (demo_main\demo_use) или в дочерних каталогах. У вас нет целей, определенных в текущем каталоге, поэтому каталог include фактически ни к чему не применяется!

Есть еще несколько проблем с кодом CMake.

  1. Ваш main функция определена в demo_use_main.c, Так что ваши add_executable вызов должен включать этот файл.
  2. Вам следует обновить версию CMake до более новой, чем 2.8.12. Команды в современном CMake более интуитивно понятны с точки зрения разработки программного обеспечения и должны упростить использование.
  3. В вашем файле CMake верхнего уровня отсутствует вызов project. Обычно это хорошая практика, и вы можете добавить в нее последующие подпроекты, вызвавprojectснова позже. Кроме того, вам понадобится толькоcmake_minimum_requiredвызовите один раз в файле CMake верхнего уровня.
  4. Вам не нужен файл CMake в каждом подкаталоге, но это дизайнерское решение.

С этими изменениями может работать лучше:

demo_main \CMakeLists.txt:

cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
# Add top-level project call.
project(DemoProject)
# Add the sub-directories more directly.
add_subdirectory(demo_use)
add_subdirectory(demo_1.0\demo_sample\zmq_sample)

demo_main \ demo_use \CMakeLists.txt:

project(zmq_demo)
# Add the executable here.
add_executable(zmq_demo demo_use_main.c)

demo_main \demo_1.0\ demo_sample \ zmq_sample \CMakeLists.txt:

# Add the HelloWorld.cpp source file to the executable's compilation.
target_sources(zmq_demo PRIVATE HelloWorld.cpp)

# Prefer target-based command here to include directories, if CMake version supports it.
target_include_directories(zmq_demo PRIVATE
    ${CMAKE_CURRENT_LIST_DIR}
)

Я рекомендую потратить некоторое время, чтобы понять преимущества использования современного CMake, поскольку он может облегчить обслуживание в долгосрочной перспективе.

Другие вопросы по тегам