0x01 介绍
make install 是一个常见的CMake命令,它用于安装库和可执行文件到系统目录中。它通常在库或应用程序构建完成后执行,并在安装过程中执行以下操作:
- 将库文件安装到系统库目录中,以便其他程序可以使用它。
- 将可执行文件安装到系统可执行文件目录中,以便其他程序可以通过命令行访问它。
- 将应用程序的配置文件和其他资源文件安装到系统目录中。
通常,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#