CMake编译报mymath.h: No such file or directory错误如何解决?
问题原因及修复方案
直接报错原因
核心问题有两个:
- 顶层
include_directories使用了相对路径,如果你采用常规的out-of-source构建(新建build目录后执行cmake ..),相对路径是相对于构建工作目录的,无法定位到源码树里的mymathlib/include路径 - 库名拼写错误,上层链接时写的
myamth和你定义的静态库名mymath不符,还会导致后续链接阶段报错
修复步骤
1. 修改顶层CMakeLists.txt
将相对路径改为基于${PROJECT_SOURCE_DIR}的绝对路径,同时修正库名拼写:
cmake_minimum_required(VERSION 3.10) project(CALCULATOR) # 改为绝对路径,确保不管在哪执行cmake都能正确定位头文件 include_directories(${PROJECT_SOURCE_DIR}/mymathlib/include) add_subdirectory(mymathlib) add_executable(calculator ${PROJECT_SOURCE_DIR}/main.c) # 修正库名拼写错误,myamth改为mymath target_link_libraries(calculator mymath) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) add_compile_options(-Wall -g)
2. 优化mymathlib下的CMakeLists.txt(可选,符合CMake现代规范)
建议使用target_include_directories替代全局的include_directories,这样链接该库的目标会自动继承头文件路径,无需上层单独配置:
project(MyMathLib) aux_source_directory(src SRCS) add_library(mymath STATIC ${SRCS}) # PUBLIC属性表示该头文件路径同时对当前库和链接该库的上层目标生效 target_include_directories(mymath PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)
修改完成后清空之前的构建缓存(删除build目录或CMakeCache.txt),重新执行构建流程即可解决问题。
内容的提问来源于stack exchange,提问作者C.C
相关产品推荐
相关产品推荐

