自定义src/include目录构建CMake项目时出现错误
CMake构建错误解决:子目录源文件路径问题
问题根源
- 重复添加源文件:根目录CMakeLists中已指定
src/main.cpp,子目录CMakeLists又添加main.cpp,造成重复处理。 - 相对路径解析错误:未启用CMP0076策略时,
target_sources的相对路径默认**基于目标创建的目录(根目录)**解析,而非当前子目录,导致CMake在根目录查找main.cpp,最终找不到文件。
修复方案
方案一:启用CMP0076策略规范路径解析
- 修改根目录CMakeLists.txt:先创建空可执行目标,由子目录负责添加所有源文件:
cmake_minimum_required(VERSION 3.7) project(Quick3D VERSION 0.1 LANGUAGES CXX) # 创建空目标,后续由子目录补充源文件 add_executable(${PROJECT_NAME}) add_subdirectory(src) target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include )
- 修改src目录CMakeLists.txt:设置CMP0076策略,让相对路径基于当前子目录解析:
# 启用CMP0076,使target_sources的相对路径指向当前CMakeLists所在目录 cmake_policy(SET CMP0076 NEW) target_sources( ${PROJECT_NAME} PRIVATE main.cpp mainwindow.cpp )
方案二:直接使用绝对路径指定源文件
若不想修改CMake策略,可通过CMAKE_CURRENT_SOURCE_DIR直接指定源文件的绝对路径:
修改src目录CMakeLists.txt:
target_sources( ${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mainwindow.cpp )
同时根目录CMakeLists.txt需移除src/main.cpp,避免重复添加:
cmake_minimum_required(VERSION 3.7) project(Quick3D VERSION 0.1 LANGUAGES CXX) add_executable(${PROJECT_NAME}) add_subdirectory(src) target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include )
内容的提问来源于stack exchange,提问作者Mohit Saini
相关产品推荐
相关产品推荐

