如何解决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找不到头文件是什么? 该如何纠正?
解决方法
如前所述,找不到标题,因为include_directories
调用仅适用于在当前目录(demo_main\demo_use
)或子目录中定义的目标。当前目录中没有定义目标,因此include目录实际上并没有应用于任何对象!
CMake代码没有其他问题。
- 您的
main
函数是在demo_use_main.c
中定义的,因此您的add_executable
调用应包括该文件。 - 您应该将CMake版本升级到比
2.8.12
更新的版本。从软件工程的角度来看,现代CMake中的命令更加直观,并且应使其更易于使用。 - 您的顶级CMake文件缺少对
project
的调用。通常,将其包括在内是很好的做法,您可以通过稍后再次调用project
在其下添加后续子项目。此外,您只需要在顶级CMake文件中cmake_minimum_required
调用一次。 - 您不需要每个子目录中的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}
)
我建议花一些时间来了解使用modern CMake的好处,因为从长远来看,它可能使维护变得更加容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。