13.嵌套的CMake
1.添加子目录
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
source_dir:指定了CMakeLists.txt源文件和代码文件的位置,其实就是指定子目录
binary_dir:指定了输出文件的路径,一般不需要指定,忽略即可。
EXCLUDE_FROM_ALL:在子路径下的目标默认不会被包含到父路径的ALL目标里,并且也会被排除在IDE工程文件之外。用户必须显式构建在子路径下的目标。
通过这种方式CMakeLists.txt文件之间的父子关系就被构建出来了。
父cmake文件执行add_subdirectory时,马上执行子cmake文件中的代码,从而完成子目录的构建逻辑

其中
insert.cpp:
#include "sort.h"
#include <iostream>
void insertSort(std::vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
// 条件编译:仅当DEBUG宏启用时打印调试信息
#ifdef DEBUG
std::cout << "[插入排序调试] 处理元素" << key << ",已排序部分:";
for (int k = 0; k <= i-1; ++k) std::cout << arr[k] << " ";
std::cout << std::endl;
#endif
// 向前找插入位置
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
#ifdef DEBUG
std::cout << "[插入排序调试] 插入后序列:";
for (int k = 0; k <= i; ++k) std::cout << arr[k] << " ";
std::cout << std::endl;
#endif
}
}
select.cpp:
#include "sort.h"
#include <iostream>
#include <algorithm> // 用于std::swap
void selectSort(std::vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; ++i) {
int minIdx = i;
// 条件编译:仅当DEBUG宏启用时打印调试信息
#ifdef DEBUG
std::cout << "\n[选择排序调试] 第" << i+1 << "轮,未排序部分:";
for (#include <iostream>
#include <vector>
using namespace std;
// 选择排序(升序)
void selectSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; ++i) {
int minIdx = i; // 未排序部分的最小元素索引
// 找未排序部分的最小值
for (int j = i + 1; j < n; ++j) {
if (arr[j] < arr[minIdx]) minIdx = j;
}
swap(arr[i], arr[minIdx]); // 交换最小值到已排序部分末尾
}
}int k = i; k < n; ++k) std::cout << arr[k] << " ";
std::cout << std::endl;
#endif
// 找未排序部分的最小值索引
for (int j = i + 1; j < n; ++j) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
#ifdef DEBUG
std::cout << "[选择排序调试] 找到最小值" << arr[minIdx] << ",交换位置" << i << "和" << minIdx << std::endl;
#endif
std::swap(arr[i], arr[minIdx]);
#ifdef DEBUG
std::cout << "[选择排序调试] 交换后序列:";
for (int k = 0; k < n; ++k) std::cout << arr[k] << " ";
std::cout << std::endl;
#endif
}
}
sort.cpp:
#include "sort.h"
#include <iostream>
#include <vector>
// 辅助函数:打印数组
void printArray(const std::vector<int>& arr, const std::string& desc) {
std::cout << desc << ":";
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
}
int main() {
// 测试插入排序
std::vector<int> arr_insert = {12, 5, 67, 2, 54, 6, 32, 45, 22, 7, 89, 66};
printArray(arr_insert, "插入排序前");
insertSort(arr_insert);
printArray(arr_insert, "插入排序后");
std::cout << "------------------------" << std::endl;
// 测试选择排序
std::vector<int> arr_select = {12, 5, 33, 10, 6};
printArray(arr_select, "选择排序前");
selectSort(arr_select);
printArray(arr_select, "选择排序后");
return 0;
}
父CMakeList.txt:
cmake_minimum_required(VERSION 3.10.2)
project(test)
# 定义变量
# 静态库生成路径
set(LIBPATH ${PROJECT_SOURCE_DIR}/lib)
# 可执行程序的存储目录
set(EXECPATH ${PROJECT_SOURCE_DIR}/bin)
# 头文件路径
set(HEADPATH ${PROJECT_SOURCE_DIR}/include)
# 库文件的名字
set(CALCLIB calc)
set(SORTLIB sort)
# 可执行程序的名字
set(APPNAME1 app1)
set(APPNAME2 app2)
# 给当前节点添加子目录
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)
cale_CMake:
cmake_minimum_required(VERSION 3.10.2)
project(calc)
# 搜索源文件
aux_source_directory(./ SRC)
# 指定头文件目录
include_directories(${HEADPATH})
# 指定静态库生成位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})
# 原文件变成静态库
add_library(${CALCLIB} STATIC ${SRC})
sort_CMake:
cmake_minimum_required(VERSION 3.10.2)
project(sort)
# 搜索源文件
aux_source_directory(./ SRC)
# 指定头文件目录
include_directories(${HEADPATH})
# 指定静态库生成位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})
# 原文件变成静态库
add_library(${SORTLIB} STATIC ${SRC})
test1_CMake:
cmake_minimum_required(VERSION 3.10.2)
project(test1)
# 搜索源文件
aux_source_directory(./ SRC)
# 指定头文件目录
include_directories(${HEADPATH})
# 指定静态库文件路径
link_directories(${LIBPATH})
# 链接静态库
link_libraries(${CALCLIB})
# 指定可执行程序存储路径
set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})
# 生成可执行文件
add_executable(${APPNAME1} ${SRC})
test2_CMake:
cmake_minimum_required(VERSION 3.10.2)
project(test2)
# 搜索源文件
aux_source_directory(./ SRC)
# 指定头文件目录
include_directories(${HEADPATH})
# 指定静态库文件路径
link_directories(${LIBPATH})
# 链接静态库
link_libraries(${SORTLIB})
# 指定可执行程序存储路径
set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})
# 生成可执行文件
add_executable(${APPNAME2} ${SRC})
执行结果


浙公网安备 33010602011771号