CMake基本用法(上)

cmake是一种跨平台的编译工具,用简单的语言描述平台的编译过程;本文主要介绍cmake的一些基本用法,不足之处请各位道友指正。

cmake调试版本
cmake --version

cmake version 3.14.5

调试环境

CentOS Linux release 7.3.1611

编写cmake配置文件CMakeLists.txt

1. 单个源文件

CMakeLists.txt

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

#生成目标文件
add_executable(demo main.cc)

main.cc

#include <iostream>

int main(int argc, char* argv[]) 
{
    std::cout<<"demo test"<<std::endl;

	return 0;
}

在CMakeLists.txt文件夹同级目录下创建build文件夹

cd build     //进入该文件夹
cmake ../      //生成Mkaefile等文件
make     //生成目标文件
./demo     //执行目标文件
demo test

2. 多个源文件(同一目录)

2.1 方法1

在main.cc所在的文件夹中创建demo.h和demo.cc文件
demo.h

class ADD{
public:
    int add(int x, int y);
}

demo.cc

#include “demo.h”
int ADD::add(int x, int y)
{
    return x + y;
}

修改CMakeLists.txt文件,不同的文件之间通过空格隔开

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

#生成目标文件
add_executable(demo main.cc demo.h demo.cc)

修改了CMakeLists.txt文件,需要重新进行cmake

make clean   
cmake ../
make 
./demo

2.2 方法2

在方法1中,文件如果过多,文件的添加是一件很繁琐的事情,并且不易维护,可以使用aux_source_directory来管理源文件

在CMakeLists.txt所在的目录下,新建code目录,将所有的文件放在该目录下
修改CMakeLists文件

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

aux_source_directory(./code DIR)

#生成目标文件
add_executable(demo ${DIR})

修改完成之后,重新进行cmake

2.3 方法3

方法2同样存在弊端,cmake会去查找code目录下的所有文件,这样做其实不利于文件的管理,并且在修改维护上也不是很灵活;

可以将源码文件放在一个变量中,然后在生成目标文件的时候再加载,个人感觉虽然增加了代码量,但是会更加整洁

修改CMakeLists文件

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

set(CODE_LIST
   code/main.cc
   code/demo.h
   code/demo.cc
)

MESSAGE(STATUS "code list is: ${CODE_LIST}")

#生成目标文件
add_executable(demo ${CODE_LIST})

修改完成之后,重新进行cmake

3. 多个源文件(不同目录)

方法2.3可以添加不同级、不同目录的文件
在CMakeLists文件同级目录下,新建min文件夹,并添加min.h和min.cc文件

min.h

class MIN{
public:
	int min(int a, int b);
}

min.cc

#include "min.h"

int MIN::min(int a, int b){
	return a>b?b:a;
}

main.cc

#include <iostream>
#include "code/demo.h"
#include "min/min.h"

int main(int argc, char* argv[]) 
{
	ADD a1;
    std::cout<<a1.add(5, 4)<<std::endl;
	
	MIN m1;
	std::cout<<m1.min(5, 4)<<std::endl;
	return 0;
}

修改CMakeLists文件

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

set(CODE_LIST
   main.cc
   
   code/demo.h
   code/demo.cc
	
	min/min.h
	min/min.cc
)

MESSAGE(STATUS "code list is: ${CODE_LIST}")

#生成目标文件
add_executable(demo ${CODE_LIST})

修改完成之后,重新进行cmake
注:本来main.cc在code目录下,现在将其放在了code目录的上一级,main和CMakeLists文件都有修改;

4. 静态库&动态库的加载

静态库使用的是libjsoncpp.a

静态库加载分为4个步骤:

  1. 设置头文件的路径
  2. 包含头文件
  3. 指定库的目录
  4. 连接静态库

main.cc文件修改

#include <iostream>
#include <string>
#include "code/demo.h"
#include "min/min.h"
#include "json/json.h"

int main(int argc, char* argv[]) 
{
	ADD a1;
    std::cout<<a1.add(5, 4)<<std::endl;
	
	MIN m1;
	std::cout<<m1.min(5, 4)<<std::endl;
	
	Json::Value root;
	Json::StyledWriter writer;
	root["name"]="Anna";
	root["class"]="Three";
	root["city"]="A";
	std::string strJson = writer.write(root);
	std::cout<<"strJson is: "<<strJson<<std::endl;
	
	return 0;
}

修改CMakeLists文件
在CMakeLists同级目录下创建libinfo文件夹,在libinfo文件夹下创建include和lib文件;include文件夹存放头文件,lib文件夹存在库文件

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

set(CODE_LIST
   main.cc
   
   code/demo.h
   code/demo.cc
	
	min/min.h
	min/min.cc
)

MESSAGE(STATUS "code list is: ${CODE_LIST}")

#生成目标文件
add_executable(demo ${CODE_LIST})

#设置头文件路径
set(INCLUDE_DIR
    libinfo/include  
    )
MESSAGE(STATUS "include_dir is: ${INCLUDE_DIR}")

#设置库文件路径
set(LIB_DIR
    ${PROJECT_SOURCE_DIR}/libinfo/lib  
)

target_include_directories(demo
   PUBLIC ${INCLUDE_DIR}   
)
  
target_link_libraries(demo     
  PUBLIC
  ${LIB_DIR}/libjsoncpp.a  
  )

在加载静态库的时候,还可以通过add_library()和set_property()来指定静态库的路径和名称

修改完成之后重新cmake

动态库的加载,以glog为例

动态库加载分为4个步骤:

  1. 设置头文件的路径
  2. 包含头文件
  3. 指定库的目录
  4. 连接动态库

main.cc文件修改

#include <iostream>
#include <string>
#include "code/demo.h"
#include "min/min.h"
#include "glog/logging.h"
#include "json/json.h"

int main(int argc, char* argv[]) 
{
	//glog使用之前需要初始化
	google::InitGoogleLogging("");
    FLAGS_alsologtostderr = true;
    FLAGS_colorlogtostderr = true;
    google::SetLogDestination(google::GLOG_INFO, "");
    google::SetLogDestination(google::GLOG_WARNING, "");
    google::SetLogDestination(google::GLOG_ERROR, "");
    google::SetLogDestination(google::GLOG_FATAL, ""); 

	ADD a1;
    std::cout<<a1.add(5, 4)<<std::endl;
	
	MIN m1;
	std::cout<<m1.min(5, 4)<<std::endl;
	
	Json::Value root;
	Json::StyledWriter writer;
	root["name"]="Anna";
	root["class"]="Three";
	root["city"]="A";
	std::string strJson = writer.write(root);
	std::cout<<"strJson is: "<<strJson<<std::endl;
	LOG(INFO)<<"strJson is: "<<strJson;
	
	google::ShutdownGoogleLogging();	//需要关闭库
	return 0;
}

修改CMakeLists文件

#指定cmake最低版本
cmake_minimum_required(VERSION 3.14.5)

#项目名称
project(demo)

set(CODE_LIST
   main.cc
   
   code/demo.h
   code/demo.cc
	
	min/min.h
	min/min.cc
)

MESSAGE(STATUS "code list is: ${CODE_LIST}")

#生成目标文件
add_executable(demo ${CODE_LIST})

#设置头文件路径
set(INCLUDE_DIR
    libinfo/include  
    )
MESSAGE(STATUS "include_dir is: ${INCLUDE_DIR}")

#设置库文件路径
set(LIB_DIR
    ${PROJECT_SOURCE_DIR}/libinfo/lib  
)

target_include_directories(demo
   PUBLIC ${INCLUDE_DIR}   
)
  
target_link_libraries(demo     
  PUBLIC
  ${LIB_DIR}/libjsoncpp.a  
  )

#动态库
link_directories(${LIB_DIR}
)

MESSAGE(STATUS "LIB_DIR is: ${LIB_DIR}")

target_link_libraries(demo
    PUBLIC
    -lglog      
    )

修改完成之后重新进行cmake

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值