一:安装和查看版本
二:范例1学习(只有单个源文件)
(1)构建源文件
#include<stdio.h>
int main(void)
{
printf("hello cmake\n");
return 0;
}
(2)书写CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
add_executable(main main.c)
cmake_minimum_required : cmake的版本要求
project:工程名
add_executable:mian是目标文件名称,main.c是生成目标文件依赖的源文件。
(3)执行cmake .命令
中途会生成很多的信息,同Makefile也生成了。
(4)执行make命令,这个时候,便会去按照Makefile的内容生成目标文件main了
(5)运行目标文件
当然,如果我们想删除目标文件main,只需要make clean就可以了。
三:范例二(同一个目录下多个源文件)
(1)在同一个目录下构建以下文件
main.c
#include<stdio.h>
#include "funa.h"
#include "funb.h"
int main(void)
{
funa();
funb();
return 0;
}
funa.c
#include<stdio.h>
void funa()
{
printf("funa\n");
}
funa.h
#ifndef _FUNA_H_
#define _FUNA_H_
void funa();
#endif
funb.c
#include<stdio.h>
void funb()
{
printf("funb\n");
}
funb.h
#ifndef _FUNB_H_
#define _FUNB_H_
void funb();
#endif
(2)书写CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
add_executable(main main.c funa.c funb.c)
现在生成main的依赖变成了main.c funa.c funb.c三个源文件了。(如果源文件很多我们肯定不能这么写)
(3)以下是执行结果
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/hgfs/酸菜/cmakee/test2
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$ make
Scanning dependencies of target main
[ 25%] Building C object CMakeFiles/main.dir/main.c.o
[ 50%] Building C object CMakeFiles/main.dir/funa.c.o
[ 75%] Building C object CMakeFiles/main.dir/funb.c.o
[100%] Linking C executable main
[100%] Built target main
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$ ./main
funa
funb
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
(4)我们优化一下CMakeLists.txt,改成如下
cmake_minimum_required (VERSION 2.8)
project (demo)
aux_source_directory(. SRC_LIST)
add_executable(main ${SRC_LIST})
其中,增加了aux_source_directory命令,该命令的意思是把当前目录下的源文件存放到当前目录下的源文件列表变量SRC_LIST中来,以上面的例子举例,.代表当前目录,所以变量SRC_LIST就相当于main.c funa.c funb.c,,而${SRC_LIST}其实就相当于取出SRC_LIST的值。
重新执行:
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/hgfs/酸菜/cmakee/test2
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$ make
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/hgfs/酸菜/cmakee/test2
[ 25%] Building C object CMakeFiles/main.dir/funa.c.o
[ 50%] Building C object CMakeFiles/main.dir/funb.c.o
[ 75%] Building C object CMakeFiles/main.dir/main.c.o
[100%] Linking C executable main
[100%] Built target main
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$ ./main
funa
funb
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test2$
(5)针对aux_source_directory的优化,该命令会把当前目录下的所有源文件添加进来,如果我们只想添加指定的源文件,那么可以用set命令,比如
cmake_minimum_required (VERSION 2.8)
project (demo)
#aux_source_directory(. SRC_LIST)
set( SRC_LIST
./main.c
./funa.c
./funb.c)
add_executable(main ${SRC_LIST})
四:范例三(企业级别目录下的工程构建方法)
其中:源文件和头文件和范例二一样。
(1)整体目录构建
其中bin目录放目标文件,src目录放源文件,include放头文件,build存放一些临时文件,其中,外层CMakeLists.txt的内容如下,
cmake_minimum_required (VERSION 2.8)
project (demo)
add_subdirectory (src)
add_subdirectory 命令:当执行cmake时,该CMakeLists.txt就会去寻找src目录下的CMakeLists.txt文件,我们看看src目录下的CMakeLists.txt文件内容,
aux_source_directory (. SRC_LIST)
include_directories (../include)
add_executable (main ${
SRC_LIST})
set (EXECUTABLE_OUTPUT_PATH ${
PROJECT_SOURCE_DIR}/bin)
include_directories :用于添加头文件路径,这样我们在包含头文件时就可以直接写成如下形式了,
#include "funa.h"
#include "funb.h"
当然,如果没有include_directories (…/include)这个也是可以的,在包含头文件时加上头文件的相对路径就好了。
这里set是用于定义变量EXECUTABLE_OUT_PATH和PROJECT_SOURCE_DIR是CMake自带的预定义变量,其意义如下,
EXECUTABLE_OUTPUT_PATH :目标二进制可执行文件的存放位置
PROJECT_SOURCE_DIR:工程的根目录
(2)CMakeLists.txt写好以后,我们去build目录下执行cmake命令,
注意是cmake …因为CMakeLists.txt的路径在外面。
这个时候makefile文件已经在build目录下生成了,在执行make就可以生成目标文件main了
最后去bin目录下执行目标文件。
五:范例四(添加编译选项)
add_compile_options(-std=c++11 -Wall)
当我们要添加编译选项时,用add_compile_options命令即可。
六:(范例五)编译成静态库或者动态库
(1)整体目录结构
(2)
fun.c
#include <stdio.h>
void funa()
{
printf("funa\n");
}
fun.h
#include <stdio.h>
void funa();
(3)CMakeLists.txt内容
cmake_minimum_required (VERSION 3.5)
project (demo)
set (SRC_LIST ${
PROJECT_SOURCE_DIR}/fun/fun.c)
#testFunc_shared是动态库的名字,SHARED表示要生成动态库,${
SRC_LIST}表示生成动态库的依赖
add_library (testFunc_shared SHARED ${
SRC_LIST})
#testFunc_static是静态库的名字,STATIC表示要生成静态库,${
SRC_LIST}表示生成动态库的依赖
add_library (testFunc_static STATIC ${
SRC_LIST})
#下面这的是用来设置生成的静态库或者动态库的一些属性,比如名字或者版本号等
#set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
#set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")
set (LIBRARY_OUTPUT_PATH ${
PROJECT_SOURCE_DIR}/lib)
(4)执行结果
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test4$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/hgfs/酸菜/cmakee/test4
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test4$ make
Scanning dependencies of target testFunc_static
[ 25%] Building C object CMakeFiles/testFunc_static.dir/fun/fun.c.o
[ 50%] Linking C static library lib/libtestFunc_static.a
[ 50%] Built target testFunc_static
Scanning dependencies of target testFunc_shared
[ 75%] Building C object CMakeFiles/testFunc_shared.dir/fun/fun.c.o
[100%] Linking C shared library lib/libtestFunc_shared.so
[100%] Built target testFunc_shared
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test4$ ls
CMakeCache.txt cmake_install.cmake fun Makefile
CMakeFiles CMakelists.txt lib
txj@ubuntu:/mnt/hgfs/酸菜/cmakee/test4$
七:(范例六,链接到动态库或者静态库)
(1)目录结构:执行cmake .以后的。
(2)CMakeLists.txt
cmake_minimum_required (VERSION 3.5)
project (demo)
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set (SRC_LIST ${PROJECT_SOURCE_DIR}/main.c)
#find fun.h
include_directories (${PROJECT_SOURCE_DIR}/inc)
find_library(FUN_LIB testFunc_static HINTS ${PROJECT_SOURCE_DIR}/lib)
add_executable (main ${SRC_LIST})
target_link_libraries (main ${FUN_LIB})
(3)源文件
#include <stdio.h>
#include "fun.h"
int main(void)
{
funa();
return 0;
}
用到的库是上一个小结当中生成的,把它放在lib目录下。
这是执行结果。