https://www.cnblogs.com/douzujun/p/10761176.html
参考: https://www.hahack.com/codes/cmake/
1. 单目标文件
main.c
- #include <stdio.h>
- #include <stdlib.h>
- double power(double base, int exponent)
- {
- int result = base;
- int i;
- if (exponent == 0) {
- return 1;
- }
- for(i = 1; i < exponent; ++i){
- result = result * base;
- }
- return result;
- }
- int main(int argc, char *argv[])
- {
- if (argc < 3){
- printf("Usage: %s base exponent ", argv[0]);
- return 1;
- }
- double base = atof(argv[1]);
- int exponent = atoi(argv[2]);
- double result = power(base, exponent);
- printf("%g ^ %d is %g ", base, exponent, result);
- return 0;
- }
CMakeLists.txt
- cmake_minimum_required (VERSION 2.8) # 指定最低的版本号
- # 项目信息
- project (Demo01_cmake)
- # 指定生成目标
- add_executable(Demo_exe main.c) # Demo_exe为生成的可执行文件 main.c为依赖文件
然后
- cmake . # 生成makeFile文件
make # 执行make
2. 同一个目录,多个源文件
calc_power.h
- double power(double a, int b);
calc_power.c
- #include "calc_power.h"
- double power(double base, int exponent)
- {
- int result = base;
- int i;
- if (exponent == 0) {
- return 1;
- }
- for(i = 1; i < exponent; ++i){
- result = result * base;
- }
- return result;
- }
main.cpp
- #include <stdio.h>
- #include <stdlib.h>
- #include "calc_power.h"
- int main(int argc, char *argv[])
- {
- if (argc < 3){
- printf("Usage: %s base exponent ", argv[0]);
- return 1;
- }
- double base = atof(argv[1]);
- int exponent = atoi(argv[2]);
- double result = power(base, exponent);
- printf("%g ^ %d is %g ", base, exponent, result);
- return 0;
- }
CMakeLists.txt
- cmake_minimum_required (VERSION 2.8)
- # 项目信息
- project (Demo2_cmake)
- # 指定生成目标
- # add_executable(Demo2_cmake main.c calc_power.c) # 如果源文件多,这样写麻烦
- # 该命令会查找指定目录下的所有源文件, 然后将结果存到指定变量名
- # 如下: 查找当前目录下的所有源文件, 并将名称报错到 DIR_SRCS 变量
- aux_source_directory(. DIR_SRCS)
- # 指定生成目标
- # CMake 会将当前目录所有源文件名赋值给变量 DIR_SRCS
- # 再指示变量 DIR_SRCS 中源文件 编译成一个 Demo2_exe的可执行文件
- add_executable(Demo2_exe ${DIR_SRCS})
再执行
- cmake .
- make
3. 多目录,多文件
main.c
- #include <stdio.h>
- #include <stdlib.h>
- #include "./mymath/calc_power.h"
- int main(int argc, char *argv[])
- {
- if (argc < 3){
- printf("Usage: %s base exponent ", argv[0]);
- return 1;
- }
- double base = atof(argv[1]);
- int exponent = atoi(argv[2]);
- double result = power(base, exponent);
- printf("%g ^ %d is %g ", base, exponent, result);
- return 0;
- }
mymath的目录下CMakeLists.txt
- # 查找当前目录下的所有源文件
- # 并将名称保存到 DIR_LIB_SRCS 变量
- aux_source_directory(. DIR_LIB_SRCS)
- # 生成链接库
- # 使用add_library 将src目录中的源文件编译成静态链接库
- add_library(calc_power $(DIR_LIB_SRCS))
main.c所在的目录下的CMakeLists.txt
- # Make 最低版本号要求
- cmake_minimum_required (VERSION 2.8)
- # 项目信息
- project (Demo3_cmake)
- # 查找当前目录下的所有源文件
- # 并将名称保存到 DIR_SRCS 变量
- aux_source_directory(. DIR_SRCS)
- # 添加 math 子目录, 这样mymath目录下的 CMakeLists.txt文件和源代码也会被处理
- add_subdirectory(mymath)
- # 指定生成目标
- add_executable(Demo3_exe main.c)
- # 添加链接库, 指明可执行文件Demo3_exe 需要连接一个名为 calc_power的链接库
- target_link_libraries(Demo3_exe calc_power)
然后:
- cmake .
- make