CMake链接独立目录库时报错缺少CMAKE_CXX_COMPILE_OBJECT变量如何解决
错误根源
你根目录下的CMakeLists.txt指令顺序写错了:add_subdirectory(math)放在了project(Tutorial)之前。
CMake的project指令会自动检测当前环境的C/C++编译器,配置编译、生成静态库所需的内部变量(包括你报错里缺失的CMAKE_CXX_COMPILE_OBJECT、CMAKE_CXX_CREATE_STATIC_LIBRARY)。你在编译器还没完成配置的情况下就执行add_subdirectory加载子目录的构建逻辑,子目录里add_library需要用到的编译相关变量还没有被初始化,所以抛出了这个错误。
修复方案
修改根目录CMakeLists.txt的指令顺序,把project(Tutorial)移到add_subdirectory(math)前面即可,修改后的内容如下:
# /CMakeLists.txt cmake_minimum_required(VERSION 3.10) # 先执行project指令配置编译器 project(Tutorial) # 再加载子目录构建逻辑 add_subdirectory(math) add_executable(Tutorial tutorial.cpp) target_link_libraries(Tutorial PUBLIC math) target_include_directories( Tutorial PUBLIC "${PROJECT_SOURCE_DIR}/math")
可选优化
你也可以把头文件路径的配置移到math子目录的CMakeLists.txt里,这样主项目不需要额外配置头文件路径,链接math库时会自动继承头文件路径:
修改/math/CMakeLists.txt:
add_library(math half.cpp) target_include_directories(math INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
修复后先清空build目录下的旧缓存文件,再重新执行cmake ..和构建命令即可正常编译。
内容的提问来源于stack exchange,提问作者Matias Haeussler
相关产品推荐
相关产品推荐

