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.
- Ваш
main
функция определена вdemo_use_main.c
, Так что вашиadd_executable
вызов должен включать этот файл. - Вам следует обновить версию CMake до более новой, чем
2.8.12
. Команды в современном CMake более интуитивно понятны с точки зрения разработки программного обеспечения и должны упростить использование. - В вашем файле CMake верхнего уровня отсутствует вызов
project
. Обычно это хорошая практика, и вы можете добавить в нее последующие подпроекты, вызвавproject
снова позже. Кроме того, вам понадобится толькоcmake_minimum_required
вызовите один раз в файле CMake верхнего уровня. - Вам не нужен файл 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, поскольку он может облегчить обслуживание в долгосрочной перспективе.