本文主要内容如下:
1. 使用CMake将多个文件编译为可执行文件(包括cmake普通的set变量, file、aux_source_directory获取文件名三种方法)。
2. 多目录cmake使用。
3. 使用cmake生成静态,动态lib,以及lib和头文件的安装,以及安装到指定路径;lib版本的生成;如何卸载(实际上是删除)cmake安装的lib以及头文件。
1 多个文件编译为target
目录结构如下:
├── CMakeLists.txt
├── demo_3.cpp
├── demo3_h.h
└── demo3_main.cpp
demo3_h.h内容如下:
namespace demo3{
void print_demo3();
}
demo_3.cpp代码如下:
#include "demo3_h.h"
#include <iostream>
namespace demo3{
void print_demo3(){
std::cout<<"this is demo3"<<std::endl;
}
}
整个工程结构如下:
CMakeLists.txt 如下,使用三种方式设置文件读取:
cmake_minimum_required(VERSION 3.5)
project(demo3)
# This project show multi files build in cmake.
# first way: set source file by name
#set(SRC_LIST demo3_main.cpp demo_3.cpp)
# second way: use this get all the files in the current directory
# aux_source_directory(. SRC_LIST)
# third way: file glob
file(GLOB SRC_LIST ./*.cpp)
add_executable(demo3 ${SRC_LIST})
2. 多目录cmake使用
目录结构如下:
├── CMakeLists.txt
├── demo4_inc
│ ├── demo_4.cpp
│ └── demo4_h.h
└── demo4_main.cpp
CMakeLists.txt 如下:
cmake_minimum_required(VERSION 3.5)
project(demo4)
# This project show multi files build in cmake.
include_directories(demo4_inc)
aux_source_directory(. SRC_LIST)
message("src list is ${SRC_LIST}")
# if not add src in demo4_inc, then you will get "undefined reference to `demo4::print_demo4()"
aux_source_directory(demo4_inc SRC_LIST)
message("after add demo4_inc directory src list is ${SRC_LIST}")
add_executable(demo4 ${SRC_LIST})
编译输出如下:
3. 使用cmake生成静态,动态lib,以及lib和头文件的安装,以及安装到指定路径;lib版本的生成;如何卸载(实际上是删除)cmake安装的lib以及头文件
3.1 生成安装lib
项目结构如下:
├── CMakeLists.txt
├── demo_5.cpp
└── demo5_h.h
CMakeLists.txt 如下(生成static lib):
cmake_minimum_required(VERSION 3.5)
project(demo5)
aux_source_directory(. SRC_LIST)
# create static lib
add_library(demo5 STATIC ${SRC_LIST})
# install lib and .h
install(TARGETS demo5 DESTINATION lib)
install(FILES demo5_h.h DESTINATION include)
如果要生成so lib:
# create dynamic lib
add_library(demo5_dynamic SHARED ${SRC_LIST})
ubuntu16下默认的安装在/usr/local下面:
root@xy:~/cmake_practice/cmake_build/build_demo5# make install
[100%] Built target demo5
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libdemo5.a
-- Installing: /usr/local/include/demo5_h.h
3.2 指定安装目录
cmake -DCMAKE_INSTALL_PREFIX=./ ../../cmake_tuorial/demo5/
输出如下:
3.3 卸载(本质上是删除)安装的lib
build目录下面有install_manifest.txt文件,内容如下:
/usr/local/lib/libdemo5.a
/usr/local/include/demo5_h.h
如下命令删除安装(https://stackoverflow.com/questions/41471620/cmake-support-make-uninstall (cited from)):
xargs rm < install_manifest.txt
#
3.4 添加lib版本
下个如下
# 指定lib输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 指定版本
set(DEMO5_VERSION_MAJOR 1)
set(DEMO5_VERSION_MINOR 1)
set(DEMO5_VERSION_PATCH 1)
set(DEMO5_VERSION ${DEMO5_VERSION_MAJOR}.${DEMO5_VERSION_MINOR}.${DEMO5_VERSION_PATCH})
aux_source_directory(. SRC_LIST)
add_library(demo5 SHARED ${SRC_LIST})
set_target_properties(demo5 PROPERTIES VERSION ${DEMO5_VERSION}
SOVERSION ${DEMO5_VERSION_MAJOR}
)
编译输出如下:
root@xy:~/cmake_practice/cmake_build/build_demo5# ll -th lib/
total 36K
-rwxr-xr-x 1 root root 8.6K May 20 09:51 libdemo5.so.1.1.1*
drwxr-xr-x 2 root root 4.0K May 20 09:51 ./
lrwxrwxrwx 1 root root 13 May 20 09:51 libdemo5.so -> libdemo5.so.1*
lrwxrwxrwx 1 root root 17 May 20 09:51 libdemo5.so.1 -> libdemo5.so.1.1.1*