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
:这里创建一个空文件即可。
要点
- 在本教程中演示了如何在CMakeLists.txt中添加对安装的支持。CMakeLists的前半段和前文Shared Library的部分一致。我们看看install函数的使用
- install(标识符 对象 目标根目录 目标文件夹)
- 标识符有TARGETS,DIRECTORY,FILES。TARGETS用于编译出来的lib或者二进制文件。DIRECTORY后面跟目录地址,FILES跟文件地址
- DESTINATION就是$CMAKE_INSTALL_PREFIX里定义的路径,详见下面修改安装路径部分。最终路径是目标根目录+目录文件夹的组合路径
- 在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可以参考这里。不过大概率也用不上。