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个步骤:
- 设置头文件的路径
- 包含头文件
- 指定库的目录
- 连接静态库
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个步骤:
- 设置头文件的路径
- 包含头文件
- 指定库的目录
- 连接动态库
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