前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMake示例教程三

CMake示例教程三

作者头像
bear_fish
发布2018-09-14 09:50:52
2.4K0
发布2018-09-14 09:50:52
举报

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1338348

本文主要内容如下:

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内容如下:

代码语言:javascript
复制
namespace demo3{
    void print_demo3();
}

demo_3.cpp代码如下:

代码语言:javascript
复制
#include "demo3_h.h"
#include <iostream>

namespace demo3{
    void print_demo3(){
        std::cout<<"this is demo3"<<std::endl;
    }
}

整个工程结构如下:

CMakeLists.txt 如下,使用三种方式设置文件读取:

代码语言:javascript
复制
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 如下:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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:

代码语言:javascript
复制
# create dynamic lib
add_library(demo5_dynamic SHARED ${SRC_LIST})

ubuntu16下默认的安装在/usr/local下面:

代码语言:javascript
复制
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 指定安装目录
代码语言:javascript
复制
cmake -DCMAKE_INSTALL_PREFIX=./  ../../cmake_tuorial/demo5/ 

输出如下:

3.3 卸载(本质上是删除)安装的lib

build目录下面有install_manifest.txt文件,内容如下:

代码语言:javascript
复制
/usr/local/lib/libdemo5.a
/usr/local/include/demo5_h.h

如下命令删除安装(https://stackoverflow.com/questions/41471620/cmake-support-make-uninstall (cited from)):

代码语言:javascript
复制
xargs rm < install_manifest.txt
# 
3.4 添加lib版本

下个如下

代码语言:javascript
复制
# 指定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}
        )

编译输出如下:

代码语言:javascript
复制
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*
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文主要内容如下:
  • 1 多个文件编译为target
  • 2. 多目录cmake使用
  • 3. 使用cmake生成静态,动态lib,以及lib和头文件的安装,以及安装到指定路径;lib版本的生成;如何卸载(实际上是删除)cmake安装的lib以及头文件
    • 3.1 生成安装lib
      • 3.2 指定安装目录
        • 3.3 卸载(本质上是删除)安装的lib
          • 3.4 添加lib版本
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档