使用.inl文件创建CMake静态库失败,改为.cpp可正常构建
解决CMake无法识别.inl文件导致静态库构建失败的问题
问题根源
- CMake默认不关联.inl与C++语言:你通过
add_library添加的print.inl和print.hpp中,.hpp属于头文件不会被编译,而CMake没有默认将.inl识别为C++源文件,因此它判定目标printer没有可编译的源文件,无法确定链接语言,最终触发报错。 - 头文件包含路径错误:你的
print.hpp中写的是#include "print.cpp",但实际实现文件是print.inl,即便CMake问题解决,后续编译阶段也会出现文件找不到的错误。
解决方案
方案1:让CMake识别.inl为C++文件
在CMakeLists.txt中添加配置,指定单个.inl文件的语言属性:
cmake_minimum_required(VERSION 3.0.0) project(CarSimulator VERSION 0.1.0 LANGUAGES C CXX) include(CTest) enable_testing() # 告知CMake将print.inl当作C++源文件处理 set_source_files_properties(print.inl PROPERTIES LANGUAGE CXX) add_library(printer print.inl print.hpp ) set_property(TARGET printer PROPERTY CXX_STANDARD 20) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack)
如果有多个.inl文件,也可以全局配置所有.inl文件为C++:
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${CMAKE_CXX_SOURCE_FILE_EXTENSIONS} inl)
方案2:用INTERFACE库管理纯模板代码(更规范)
由于你实现的是模板函数,模板实现必须在头文件中可见才能被实例化,因此不需要将.inl文件加入编译源列表,更适合使用INTERFACE库:
- 修改
print.hpp,修正包含路径:
#ifndef PRINT_H #define PRINT_H template<typename T> void print(const T& t); #include "print.inl" // 将原print.cpp改为实际的print.inl #endif
- 修改
CMakeLists.txt为INTERFACE库:
cmake_minimum_required(VERSION 3.0.0) project(CarSimulator VERSION 0.1.0 LANGUAGES C CXX) include(CTest) enable_testing() # INTERFACE库仅用于传递头文件与编译选项,不生成二进制文件 add_library(printer INTERFACE) # 指定INTERFACE库的关联头文件 target_sources(printer INTERFACE print.hpp print.inl) set_property(TARGET printer PROPERTY CXX_STANDARD 20) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack)
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

