3.CMAKE LEARNING
3
3.1CMAKE预定义变量
| PROJECT_SOURCE_DIR | 工程的根目录 |
|---|---|
| PROJECT_BINARY_DIR | 执行cmake命令的目录 |
| EXECUTABLE_OUTPUT_PATH | 重新定义目标二进制可执行文件的存放位置 |
| LIBRARY_OUTPUT_PATH | 重新定义目标链接库文件的存放位置 |
| PROJECT_NAME | 返回通过PROJECT指令定义的项目名称 |
3.2静态库和动态库的区别
- 静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。
- 静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行(如果程序编译成功,即使离开静态库,程序也是可以独立运行)。
- 动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。
3.3建立结构清晰的工程
采用结构为
├── build #存放编译生成文件
├── CMakeLists.txt
├── example #示例可以存在多个.c
│ └── main.c
├── include #头文件
│ └── bmi.h
└── src #源文件
├── bmi.c
└── CMakeLists.txt
将上一节内容拆分
// main.c
#include <stdio.h>
#include <stdlib.h>
#include "bmi.h"
int main(int argc,char* argv[])
{
float weight,high,personal_bmi;
printf("共输入%d个参数\n",argc);
if(argc != 4){
printf("请输入4个参数\n");
}
else
{
// 字符串转浮点
high = atof(argv[2]);
weight = atof(argv[3]);
personal_bmi = mybmi(high,weight);
printf("身高为:%fm,体重为:%fkg,BMI为:%f\n",high,weight,personal_bmi);
}
}
// bmi.c
#include "bmi.h"
#include <stdio.h>
float mybmi(float high,float weight){
return weight/high/high;
}
// bmi.h
#ifndef _BMI_H_
#define _BMI_H_
#include <stdio.h>
float mybmi(float high,float weight);
#endif
按照结构分别存放。
根目录下CMakeLists.txt为
# 限制cmake版本
cmake_minimum_required(VERSION 2.8)
# 设置工程名为NEWBMI,可通过预定义变量PROJECT_NAME读取
project(NEWBMI)
# 添加一个子目录并构建该子目录,若找不到目录即退出cmake
add_subdirectory(./src)
src目录下CMakeLists.txt为
# 查找在当前路径下的所有源文件并存储在变量SRCLIST中
aux_source_directory(./ SRCLIST)
# 添加编译器用于查找头文件的文件夹include
include_directories(../include)
# 从SRCLIST和example/main.c中生成名为工程名的可执行文件
add_executable(${PROJECT_NAME} ${SRCLIST} ${PROJECT_SOURCE_DIR}/example/main.c)
# 设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
在build目录下
cmake ..
make
此时文件结构为
├── build
│ ├── bin
│ │ └── NEWBMI
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── src
├── CMakeLists.txt
├── example
│ └── main.c
├── include
│ └── bmi.h
└── src
├── bmi.c
└── CMakeLists.txt
生成的可执行文件位于build/bin下,在该目录下执行
./NEWBMI 2 1.78 67


浙公网安备 33010602011771号