All You Need for CMake系列05——Installing

准备代码

代码结构如下:

.
├── cmake-examples.conf
├── CMakeLists.txt
├── include
│   └── installing
│       └── Hello.h
└── src
    ├── Hello.cpp
    └── main.cpp

相较于之前,多了一个cmake-examples.conf文件,这个是用来配置一些cmake选项的。之前的shared/static改成了installing,这是强调一下是不是动态/静态lib跟目录结构没关系,只跟下面的CMakeLists文件的写法有关。

Hello.h里内容如下:

#ifndef __HELLO_H__
#define __HELLO_H__

class Hello
{
public:
    void print();
};

#endif

Hello.cpp里内容如下:

#include <iostream>

#include "installing/Hello.h"

void Hello::print()
{
    std::cout << "Hello Install!" << std::endl;
}

main.cpp

#include "installing/Hello.h"

int main(int argc, char *argv[])
{
    Hello hi;
    hi.print();
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(cmake_examples_install)

add_library(cmake_examples_inst SHARED
    src/Hello.cpp
)

target_include_directories(cmake_examples_inst
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)

add_executable(cmake_examples_inst_bin
    src/main.cpp
)

target_link_libraries( cmake_examples_inst_bin
    PRIVATE 
        cmake_examples_inst
)

############################################################
# Install
############################################################

# Binaries
install (TARGETS cmake_examples_inst_bin
    DESTINATION bin)

# Library
# Note: may not work on windows
install (TARGETS cmake_examples_inst
    LIBRARY DESTINATION lib)

# Header files
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ 
    DESTINATION include)

# Config
install (FILES cmake-examples.conf
    DESTINATION etc)

cmake-examples.conf:这里创建一个空文件即可。

要点

  1. 在本教程中演示了如何在CMakeLists.txt中添加对安装的支持。CMakeLists的前半段和前文Shared Library的部分一致。我们看看install函数的使用
  2. install(标识符 对象 目标根目录 目标文件夹)
    • 标识符有TARGETS,DIRECTORY,FILES。TARGETS用于编译出来的lib或者二进制文件。DIRECTORY后面跟目录地址,FILES跟文件地址
    • DESTINATION就是$CMAKE_INSTALL_PREFIX里定义的路径,详见下面修改安装路径部分。最终路径是目标根目录+目录文件夹的组合路径
  3. 在windows下面的动态lib和linux上有一些区别。不过我们暂时不追求通用平台的开发。

编译流程

mkdir build
cd build
cmake ..
make

sudo make install

在生成出来的install_manifest.txt里可以看到各文件的安装路径。

修改安装路径

安装路径的默认变量是CMAKE_INSTALL_PREFIX,默认是/usr/local,如果需要修改,可以在cmake的时候添加一个argument:cmake .. -DCMAKE_INSTALL_PREFIX=/install/location

如果不想每次都在命令行上输入,可以在CMakeLists里加上这么一段:

if( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT )
  message(STATUS "Setting default CMAKE_INSTALL_PREFIX path to ${CMAKE_BINARY_DIR}/install")
  set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE STRING "The path to use for make install" FORCE)
endif()

实际起作用的是set那一句,其中可以把${CMAKE_BINARY_DIR}/install改成你想指定的路径。

也可以在make install后面加一个DESTDIR路径make install DESTDIR=/path/to/install,但这样安装出来的路径是/path/to/install/usr/local

Uninstall

通常不会有人在CMakeLists里面写uninstall的命令,添加uninstall可以参考这里。不过大概率也用不上。