如何在CMake中指定子目录构建顺序?附项目结构与依赖说明
嘿,这事儿好办!针对你的项目结构和依赖需求,我给你梳理一套清晰的CMake配置方案,确保MyLib1先被构建成静态库,再用来编译app:
先明确你的项目结构
/ |- build |- MyLib1 | |- source | | |- lib1_s1.cpp | | |- lib2_s2.cpp | |- include | | |- lib1_s1.hpp | | |- lib2_s2.hpp | |- CMakeLists.txt |- app | |- source | | |- app_s1.cpp | | |- app_s2.cpp | |- include | | |- app_s1.hpp | | |- app_s2.hpp | |- CMakeLists.txt |- CMakeLists.txt
步骤1:完善MyLib1的CMakeLists.txt
首先得把静态库的配置补全,让它能被app正确识别和引用:
# MyLib1/CMakeLists.txt # 定义库的源文件列表 set(LIB_SRC source/lib1_s1.cpp source/lib2_s2.cpp ) # 创建静态库目标 add_library(MyLib1 STATIC ${LIB_SRC}) # 设置头文件搜索路径,用PUBLIC确保依赖它的目标能自动继承这个路径 target_include_directories(MyLib1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) # 保留你的安装规则(如果需要安装库的话) install(TARGETS MyLib1 ARCHIVE DESTINATION lib INCLUDES DESTINATION include )
步骤2:配置app的CMakeLists.txt,明确依赖关系
在app的配置里,通过target_link_libraries告诉CMake它依赖MyLib1,这样CMake就会自动保证先构建库再编译app:
# app/CMakeLists.txt # 定义app的源文件 set(APP_SRC source/app_s1.cpp source/app_s2.cpp ) # 创建app可执行文件目标 add_executable(MyApp ${APP_SRC}) # 链接到MyLib1静态库,PRIVATE表示这个依赖只对app本身有效 target_link_libraries(MyApp PRIVATE MyLib1 ) # 设置app自身的头文件搜索路径 target_include_directories(MyApp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include )
步骤3:根目录CMakeLists.txt控制子目录顺序(可选但推荐)
虽然CMake会根据依赖关系自动调整构建顺序,但显式按依赖顺序添加子目录会让配置更清晰,避免歧义:
# 根目录CMakeLists.txt cmake_minimum_required(VERSION 3.10) # 根据你的实际需求调整最低版本 project(MyProject) # 给你的项目起个名字 # 先添加MyLib1子目录,优先处理静态库的构建 add_subdirectory(MyLib1) # 再添加app子目录,此时MyLib1的目标已经存在,可直接引用 add_subdirectory(app)
补充说明
哪怕你不小心把根目录的add_subdirectory顺序写反了(先app后MyLib1),只要app通过target_link_libraries明确依赖了MyLib1,CMake也会自动调整构建顺序,先完成库的编译再处理app。不过按照依赖顺序写配置,可读性会更强,也能避免一些潜在的问题。
内容的提问来源于stack exchange,提问作者newkid
相关产品推荐
相关产品推荐

