CMake基础(5)安装项目

简介: CMake基础(5)安装项目

0x01 介绍

make install 是一个常见的CMake命令,它用于安装库和可执行文件到系统目录中。它通常在库或应用程序构建完成后执行,并在安装过程中执行以下操作:

  1. 将库文件安装到系统库目录中,以便其他程序可以使用它。
  2. 将可执行文件安装到系统可执行文件目录中,以便其他程序可以通过命令行访问它。
  3. 将应用程序的配置文件和其他资源文件安装到系统目录中。

通常,make install命令的输出目录由CMake的CMAKE_INSTALL_PREFIX变量控制。例如,如果您想要将文件安装到/usr/local目录中,您可以在CMakeLists.txt文件中指定它:

set(CMAKE_INSTALL_PREFIX /usr/local)

上面的CMakeLists.txt文件将创建一个名为my_library的动态库,并使用install命令将库文件安装到/usr/local/lib目录中。安装文件通常需要root权限。因此,非root用户 可能需要使用sudo命令来运行make install命令。

0x02 示例

此示例说明如何生成 make install 目标以在系统上安装文件和二进制文件。这基于前面的共享库示例。

本教程中的文件如下:

root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05# tree
.
├── CMakeLists.txt
├── cmake-examples.conf
├── include
│   └── installing
│       └── Hello.h
└── src
├── Hello.cpp
└── main.cpp

[CMakeLists.txt] - 包含你希望运行的 CMake 命令

# 指定CMake的最低版本要求。
cmake_minimum_required(VERSION 3.1)
 
# 使用project命令指定库的名称
project(cmake_examples_inst_bin)
 
# 使用add_library命令添加库的源代码文件。指定库的类型为SHARED
add_library(cmake_examples_inst SHARED
    src/Hello.cpp
)
 
# 添加头文件目录
target_include_directories(cmake_examples_inst
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)
 
# 使用add_executable添加可执行文件代码
add_executable(cmake_examples_inst_bin
    src/main.cpp
)
 
# 使用target_link_libraries链接静态库hello_library
target_link_libraries( cmake_examples_inst_bin
    PRIVATE 
        cmake_examples_inst
)
 
# 安装install
 
# 安装可执行文件
install (TARGETS cmake_examples_inst_bin
    DESTINATION bin)
 
# 安装共享库
install (TARGETS cmake_examples_inst
    LIBRARY DESTINATION lib)
 
# 安装头文件
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ 
    DESTINATION include)
 
# 安装配置文件
install (FILES cmake-examples.conf
    DESTINATION etc)    
[cmake-examples.conf] - 示例配置文件 
# Sample configuration file that could be installed
[include/installing/Hello.h] - 要包含的标题文件 
#ifndef __HELLO_H__
#define __HELLO_H__
 
class Hello
{
public:
    void print();
};
 
#endif

[src/Hello.cpp] - 要编译的源文件

#include <iostream>
 
#include "installing/Hello.h"
 
void Hello::print()
{
    std::cout << "Hello Install!" << std::endl;
}

[src/main.cpp] - 主源文件

#include "installing/Hello.h"
 
int main(int argc, char *argv[])
{
    Hello hi;
    hi.print();
    return 0;
}

执行 cmake .. && make -j24 和 sudo make install

root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# cmake .. && make -j24
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/d/Project/Cmake_examples/cmake_basics_05/build
[ 50%] Built target cmake_examples_inst
[100%] Built target cmake_examples_inst_bin
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# ls -ll
total 76
-rwxrwxrwx 1 root root 14056 Dec 16 21:26 CMakeCache.txt
drwxrwxrwx 1 root root  4096 Dec 16 21:26 CMakeFiles
-rwxrwxrwx 1 root root  8482 Dec 16 21:26 Makefile
-rwxrwxrwx 1 root root 16752 Dec 16 21:26 cmake_examples_inst_bin
-rwxrwxrwx 1 root root  4140 Dec 16 21:26 cmake_install.cmake
-rwxrwxrwx 1 root root   152 Dec 16 21:26 install_manifest.txt
-rwxrwxrwx 1 root root 16856 Dec 16 21:26 libcmake_examples_inst.so
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# sudo make install
[ 50%] Built target cmake_examples_inst
[100%] Built target cmake_examples_inst_bin
Install the project...
-- Install configuration: ""
-- Up-to-date: /usr/local/bin/cmake_examples_inst_bin
-- Up-to-date: /usr/local/lib/libcmake_examples_inst.so
-- Up-to-date: /usr/local/include
-- Up-to-date: /usr/local/include/installing
-- Up-to-date: /usr/local/include/installing/Hello.h
-- Up-to-date: /usr/local/etc/cmake-examples.conf
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# cat install_manifest.txt
/usr/local/bin/cmake_examples_inst_bin
/usr/local/lib/libcmake_examples_inst.so
/usr/local/include/installing/Hello.h

1.安装

CMake 提供了添加 make install 目标的功能,以允许用户安装二进制文件、库和其他文件。基本安装位置由变量 CMAKE_INSTALL_PREFIX 控制,该变量可以使用 ccmake 或通过使用cmake .. -DCMAKE_INSTALL_PREFIX=/install/location调用 cmake 来设置。

安装的文件由 install() 函数控制。

install (TARGETS cmake_examples_inst_bin

DESTINATION bin)

将目标 cmake_examples_inst_bin 生成的二进制文件安装到目标目录${CMAKE_INSTALL_PREFIX}/bin中。

install (TARGETS cmake_examples_inst

LIBRARY DESTINATION lib)

将目标 cmake_examples_inst 生成的共享库安装到目标目录${CMAKE_INSTALL_PREFIX}/lib中。

#注意: 这在 Windows 上可能不起作用。在具有 DLL 目标的平台上,可能需要添加以下内容。

install(TARGETS cmake_examples_inst

LIBRARY DESTINATION lib

RUNTIME DESTINATION bin)

install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/

DESTINATION include)

将针对 cmake_examples_inst 库进行开发的头文件安装到${CMAKE_INSTALL_PREFIX}/include目录中。

install (FILES cmake-examples.conf

DESTINATION etc)

将配置文件安装到目标${CMAKE_INSTALL_PREFIX}/etc。

在运行 make install 之后,CMake 会生成一个 install_mark.txt 文件,其中包含所有已安装文件的详细信息。

  • 注意: 如果你以 root 身份运行 make install 命令,则 install_mark.txt 文件将归 root 所有。

2.覆盖默认安装位置

如前所述,默认安装位置是从 CMAKE_INSTALL_PERFIX 设置的,默认为/usr/local/

如果你想为所有用户更改这个默认位置,可以在添加任何二进制文件或库之前将以下代码添加到你的顶端 CMakeLists.txt 中。

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()

此示例将默认安装位置设置为你的构建目录下。

3.目标文件夹

如果你希望通过进行安装来确认是否包含所有文件,则 make install 目标支持 DESTDIR 参数。

make install DESTDIR=/tmp/stage

这将为你的所有安装文件创建安装路径${DESTDIR}/${CMAKE_INSTALL_PREFIX}。在此示例中,它将在路径/tmp/stage/usr/local下安装所有文件

/usr/local/etc/cmake-examples.confroot@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# make install DESTDIR=/tmp/stage
[ 50%] Built target cmake_examples_inst
[100%] Built target cmake_examples_inst_bin
Install the project...
-- Install configuration: ""
-- Installing: /tmp/stage/usr/local/bin/cmake_examples_inst_bin
-- Set runtime path of "/tmp/stage/usr/local/bin/cmake_examples_inst_bin" to ""
-- Installing: /tmp/stage/usr/local/lib/libcmake_examples_inst.so
-- Installing: /tmp/stage/usr/local/include
-- Installing: /tmp/stage/usr/local/include/installing
-- Installing: /tmp/stage/usr/local/include/installing/Hello.h
-- Installing: /tmp/stage/usr/local/etc/cmake-examples.conf
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# tree /tmp/stage
/tmp/stage
└── usr
    └── local
        ├── bin
        │   └── cmake_examples_inst_bin
        ├── etc
        │   └── cmake-examples.conf
        ├── include
        │   └── installing
        │       └── Hello.h
        └── lib
            └── libcmake_examples_inst.so
 
7 directories, 4 files

4.卸载

默认情况下,CMake 不会添加make uninstall目标。有关如何生成卸载目标的详细信息,请参阅此常见问题解答

要从本例中删除文件的简单方法,可以使用sudo xargs rm < install_manifest.txt:

root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# ls -ll /usr/local/bin/cmake_examples_inst_bin
-rwxr-xr-x 1 root root 16752 Dec 16 21:40 /usr/local/bin/cmake_examples_inst_bin
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# cat install_manifest.txt
/usr/local/bin/cmake_examples_inst_bin
/usr/local/lib/libcmake_examples_inst.so
/usr/local/include/installing/Hello.h
/usr/local/etc/cmake-examples.confroot@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# sudo xargs rm < install_manifest.txt
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build# ls -ll /usr/local/bin/cmake_examples_inst_bin
ls: cannot access '/usr/local/bin/cmake_examples_inst_bin': No such file or directory
root@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_05/build#


相关文章
|
7月前
|
程序员 API 数据库
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
169 1
|
7月前
|
编译器 Linux C语言
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
651 0
|
6月前
|
开发者
CMake 命令行使用指南:创建构建目录与编译项目
CMake 命令行使用指南:创建构建目录与编译项目
305 0
|
7月前
|
测试技术
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
178 3
|
7月前
|
IDE Unix 测试技术
CMake基础(10)使用ninja构建
CMake基础(10)使用ninja构建
1162 1
|
7月前
|
程序员 Linux C语言
【cmake 项目依赖冲突】CMake进阶:优雅解决目标依赖和安装问题
【cmake 项目依赖冲突】CMake进阶:优雅解决目标依赖和安装问题
501 0
|
7月前
|
算法 编译器 C语言
【CMake install 命令】精通CMake安装:灵活、高效的构建和部署
【CMake install 命令】精通CMake安装:灵活、高效的构建和部署
1925 0
|
7月前
|
Linux C语言
【Linux系统编程】项目自动化构建工具make/Makefile--2
【Linux系统编程】项目自动化构建工具make/Makefile--2
|
7月前
|
Linux 开发工具 C语言
【Linux系统编程】项目自动化构建工具make/Makefile--1
【Linux系统编程】项目自动化构建工具make/Makefile--1
|
7月前
|
C++
项目自动化构建工具——make/Makefile
项目自动化构建工具——make/Makefile
77 0