CMake如何链接不同子文件夹下的多库并正确使用命名空间?
问题修复方案
- 核心问题:
libs目录下的CMakeLists.txt仅完成了uiolibs库的编译配置,未添加mathlibs子目录的编译规则,导致mathlibs库根本没有生成,链接时自然找不到对应函数的实现。
修复步骤:- 在
libs目录的CMakeLists.txt中追加一行add_subdirectory(mathlibs) - 在
mathlibs自身的目录下新建CMakeLists.txt,参照uiolibs的配置完成编译规则:
file(GLOB sources "src/*.cpp") add_library(mathlibs STATIC ${sources}) # 配置头文件路径,上层依赖自动继承 target_include_directories(mathlibs PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/includes) - 在
- 编译配置错误:根目录CMakeLists.txt中
set(CMAKE_CXX_FLAGS_RELEASE "-o0")存在参数拼写错误,小写o是指定输出文件的参数,设置优化等级需要使用大写O,可修改为-O0。另外Release模式默认启用-O2优化,如需调试建议直接切换为Debug构建类型即可,无需修改Release的默认优化配置。
CMake使用通用建议
- 尽量避免用
GLOB自动收集源文件:新增或删除源文件时,CMake无法自动感知文件变更,必须手动重新执行CMake生成指令才能生效,更稳妥的方式是显式罗列所有用到的源文件路径。 - 优先使用目标级配置,避免全局配置:不要使用
include_directories、link_directories这类全局生效的配置指令,建议全部用target_include_directories、target_link_libraries这类针对单个目标的配置,避免不同目标的配置互相干扰。 - 子库自主管理头文件路径:给子库配置
target_include_directories时使用PUBLIC参数,上层目标链接该子库时会自动继承头文件路径,无需在上层重复配置。比如给uiolibs也加上对应头文件路径配置后,主项目的target_include_directories里就不需要再手动添加libs/uiolibs/includes这类路径。 - 及时清理冗余代码:根目录中
get_filename_component(parent_dir ../ ABSOLUTE)定义后没有被任何逻辑使用,建议直接删除降低维护成本。
内容的提问来源于stack exchange,提问作者palas
相关产品推荐
相关产品推荐

