You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:31:14