
cmake是什么、为什么使用cmake
在Linux环境编写C、C++时,常用make工具编译和链接工程,在单一的Linux环境下,make已经可以很好的发挥作用时;但在复杂的开发环境、运行环境下,make就有点捉襟见肘,make对环境的依赖很强,在不同环境下不同的编译器等,make工具makefile文件都需要根据实际情况进行修改,这意味着如果一个工程需要部署在复杂的环境下,对makefile的适配也将是一项复杂的工程;在此背景之下,CMake应运而生,CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile,达到一个编写,多环境编译的效果。
从单文件开始
main.cpp
1 2 3 4 5 6
|
int () { std::cout << "Hello World!" << std::endl; return 0; }
|
CMakeLists.txt
1 2 3 4 5 6 7 8 9
|
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(main ${SOURCE_FILES})
|
执行结果:
编译多文件
创建include/lib/lib.h
1 2 3 4 5 6 7 8
|
#ifndef CMAKEHELLOWORLD_LIB_H #define CMAKEHELLOWORLD_LIB_H
namespace cmakelib{ void say_hello(); }
#endif
|
创建src/lib/lib.cpp
1 2 3 4 5 6 7 8 9 10 11
|
#include "../../include/lib/lib.h"
namespace cmakelib{
void say_hello(){ std::cout << "In lib.cpp!" << std::endl; std::cout << "Hello World!" << std::endl; } }
|
修改main.cpp
1 2 3 4 5 6
|
#include "include/lib/lib.h"
int () { cmakelib::say_hello(); return 0; }
|
目录结构
1 2 3 4 5 6
|
- include/ -lib/lib.h - src/ - lib/lib.cpp - CMakeLists.txt - main.cpp
|
CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12
|
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h)
add_executable(main ${SOURCE_FILES})
|
执行结果
1 2
|
In lib.cpp! Hello World!
|
配置头文件路径
lib/lib.cpp包含头文件使用相对路径不太优雅。修改CMakeLists.txt增加include路径,让其优雅一些。
1 2 3 4 5 6 7 8 9 10 11 12
|
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(include)
set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h)
add_executable(main ${SOURCE_FILES})
|
之后可以修改lib.cpp和main.cpp里面包含lib.h的代码
1 2 3 4 5 6 7
|
#include "lib/lib.h"
#include "lib/lib.h"
|
配置sources文件路径
当cpp文件太多时,set(SOURCE_FILES ...)命令就会变得冗长,通过配置sources文件路径解决这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(include)
aux_source_directory(src/lib DIR_SRCS)
add_executable(main main.cpp ${DIR_SRCS})
|
执行结果
1 2
|
In lib.cpp! Hello World!
|
生成链接库
修改一下lib.cpp,表明实在链接库里面执行的
1 2 3 4 5 6 7 8 9 10 11
|
#include "lib/lib.h"
namespace cmakelib{
void say_hello(){ std::cout << "In libcmakelib.a!" << std::endl; std::cout << "Hello World!" << std::endl; } }
|
将lib.cpp编译成链接库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
cmake_minimum_required(VERSION 3.6)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(include)
aux_source_directory(src/lib DIR_SRCS)
add_library(cmakelib SHARED ${DIR_SRCS})
|
使用链接库
上面把lib.cpp编成库了,下面看看如何使用这个库。
创建ldlib目录,把libcmakelib.a放到里面去,项目路径如下:
1 2 3 4 5 6 7 8
|
- include/ -lib/lib.h - src/ - lib/lib.cpp - ldlib/ - libcmakelib.a - CMakeLists.txt - main.cpp
|
修改CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
cmake_minimum_required(VERSION 3.6)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(./include)
aux_source_directory(./src/lib DIR_SRCS)
link_directories(./ldlib)
add_executable(main main.cpp)
target_link_libraries(main libcmakelib.a)
|
输出结果
1 2
|
In libcmakelib.a! Hello World!
|
近期评论