CMake示例教程三

本文主要内容如下:

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*

猜你喜欢

转载自blog.csdn.net/haluoluo211/article/details/80412021
今日推荐