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

posted @ 2023-11-06 19:49  DOinging  阅读(33)  评论(0)    收藏  举报