[7] CMake总结 - 4 INSTALL

本帖子适用于初学者,StepByStep的入门CMake,CMake也是一门编程语言,只不过是针对编译和链接这种程序构建的过程的语言,学习基本语法就可以初步入门,后面需要什么复杂的功能,进阶掌握需要自己去查找官方文档,后续会给出查阅的一些方式

INSTALL指令

安装的需要有两种,一种是从代码编译后直接make install安装,一种是打包时的指定目录安装。
这里需要引入一个新的cmake 指令 INSTALL和一个非常有用的变量CMAKE_INSTALL_PREFIX。
CMAKE_INSTALL_PREFIX变量类似于configure脚本的 –prefix,常见的使用方法看
起来是这个样子:
cmake -DCMAKE_INSTALL_PREFIX=/usr .

INSTALL指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及
文件、目录、脚本等。

INSTALL指令包含了各种安装类型,我们需要一个个分开解释:

目标文件的安装

INSTALL(TARGETS targets...
        [[ARCHIVE|LIBRARY|RUNTIME]
                   [DESTINATION <dir>]
                   [PERMISSIONS permissions...]
                   [CONFIGURATIONS
        [Debug|Release|...]]
                   [COMPONENT <component>]
                   [OPTIONAL]
                ] [...])

参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的
目标文件,可能是可执行二进制、动态库、静态库。

目标类型也就相对应的有三种,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME
特指可执行目标二进制。

DESTINATION定义了安装的路径,如果路径以/开头,那么指的是绝对路径,这时候
CMAKE_INSTALL_PREFIX其实就无效了。如果你希望使用CMAKE_INSTALL_PREFIX来
定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就是
${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>

举个简单的例子:

INSTALL(TARGETS myrun mylib mystaticlib
       RUNTIME DESTINATION bin
       LIBRARY DESTINATION lib
       ARCHIVE DESTINATION libstatic
)

上面的例子会将:
可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录
特别注意的是你不需要关心TARGETS具体生成的路径,只需要写上TARGETS名称就可以
了。

普通文件的安装

INSTALL(FILES files... DESTINATION <dir>
         [PERMISSIONS permissions...]
         [CONFIGURATIONS [Debug|Release|...]]
         [COMPONENT <component>]
         [RENAME <name>] [OPTIONAL])
可用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径。
如果默认不定义权限PERMISSIONS,安装后的权限为,OWNER_WRITE,OWNER_READ,
GROUP_READ,和WORLD_READ,即644权限。

非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS files... DESTINATION <dir>
     [PERMISSIONS permissions...]
     [CONFIGURATIONS [Debug|Release|...]]
     [COMPONENT <component>]
     [RENAME <name>] [OPTIONAL])

跟上面的FILES指令使用方法一样,唯一的不同是安装后权限为:
OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE,即755权限

目录的安装

INSTALL(DIRECTORY dirs... DESTINATION <dir>
     [FILE_PERMISSIONS permissions...]
     [DIRECTORY_PERMISSIONS permissions...]
     [USE_SOURCE_PERMISSIONS]
     [CONFIGURATIONS [Debug|Release|...]]
     [COMPONENT <component>]
     [[PATTERN <pattern> | REGEX <regex>]
      [EXCLUDE] [PERMISSIONS permissions...]] [...])

这里主要介绍其中的DIRECTORY、PATTERN以及PERMISSIONS参数。
DIRECTORY后面连接的是所在Source目录的相对路径,但务必注意:
abc和abc/有很大的区别。
abc意味着abc这个目录会安装在目标路径下;
abc/意味着abc这个目录的内容会被安装在目标路径下;
如果目录名不以/结尾,那么这个目录将被安装为目标路径下的abc,如果目录名以/结尾,
代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。
PATTERN用于使用正则表达式进行过滤,
PERMISSIONS用于指定PATTERN过滤后的文件权限。

我们来看一个例子:

INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
        PATTERN "CVS" EXCLUDE
        PATTERN "scripts/*"
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
        GROUP_EXECUTE GROUP_READ)

这条指令的执行结果是:
将icons目录安装到 <prefix>/share/myproj,将scripts/中的内容安装到
<prefix>/share/myproj
不包含目录名为CVS的目录,对于scripts/*文件指定权限为 OWNER_EXECUTE
OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.

安装时cmake脚本的执行

INSTALL([[SCRIPT <file>] [CODE <code>]] [...])
SCRIPT参数用于在安装时调用cmake脚本文件(也就是<abc>.cmake文件)
CODE参数用于执行CMAKE指令,必须以双引号括起来。比如:
INSTALL(CODE "MESSAGE(\"Sample install message.\")")
[main] 正在配置项目: shilei [proc] 执行命令: /usr/bin/cmake -DCMAKE_BUILD_TYPE:STRING=Debug -Dcmake.cmakePath:STRING=/usr/bin/cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ --no-warn-unused-cli -S/home/yun/shilei/chatproject -B/home/yun/shilei/build -G "Unix Makefiles" [cmake] Not searching for unused variables given on the command line. [cmake] -- The C compiler identification is GNU 13.2.0 [cmake] -- The CXX compiler identification is GNU 13.2.0 [cmake] -- Detecting C compiler ABI info [cmake] -- Detecting C compiler ABI info - done [cmake] -- Check for working C compiler: /usr/bin/gcc - skipped [cmake] -- Detecting C compile features [cmake] -- Detecting C compile features - done [cmake] -- Detecting CXX compiler ABI info [cmake] -- Detecting CXX compiler ABI info - done [cmake] -- Check for working CXX compiler: /usr/bin/g++ - skipped [cmake] -- Detecting CXX compile features [cmake] -- Detecting CXX compile features - done [cmake] CMake Error at CMakeLists.txt:18 (add_subdirectory): [cmake] The source directory [cmake] [cmake] /home/yun/shilei/chatproject/src [cmake] [cmake] does not contain a CMakeLists.txt file. [cmake] [cmake] [cmake] -- Configuring incomplete, errors occurred! [cmake] See also "/home/yun/shilei/build/CMakeFiles/CMakeOutput.log". [proc] 命令“/usr/bin/cmake -DCMAKE_BUILD_TYPE:STRING=Debug -Dcmake.cmakePath:STRING=/usr/bin/cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ --no-warn-unused-cli -S/home/yun/shilei/chatproject -B/home/yun/shilei/build -G "Unix Makefiles"”已退出,代码为 1 [ctest] 在测试资源管理器中找不到文件夹: /home/yun/shilei/chatproject
03-17
### 解决方案 当遇到 `CMake error 'source directory does not contain a CMakeLists.txt file'` 错误时,通常是因为指定的源目录中确实不存在 `CMakeLists.txt` 文件。以下是解决问题的方法: #### 1. 确认项目结构 确保项目的根目录或目标子目录(即 `src` 目录)存在有效的 `CMakeLists.txt` 文件。如果没有该文件,则需要手动创建并配置必要的设置[^1]。 ```cmake # 示例 CMakeLists.txt 内容 cmake_minimum_required(VERSION 3.10) project(MyProject LANGUAGES CXX) add_executable(myExecutable main.cpp) target_link_libraries(myExecutable PRIVATE Boost::boost) ``` 上述代码片段展示了如何定义一个基本的 CMake 配置文件,并链接到所需的组件(如 Boost)。这一步对于避免弃用警告以及正确引入外部库至关重要。 --- #### 2. 修改构建命令路径 如果 `CMakeLists.txt` 存在于某个特定子目录而非当前工作目录,则需调整调用路径。例如,假设 `CMakeLists.txt` 位于 `src/` 下面,可以运行以下命令来指定正确的源目录位置: ```bash mkdir build && cd build cmake ../src/ ``` 通过这种方式显式指定了父级 `src` 路径作为源码树起点,从而解决了找不到配置文件的问题。 --- #### 3. 删除无用的默认 Build Type 并优化调试体验 在某些情况下,默认生成器中的 Debug Release 类型可能不符合实际需求。可以通过编辑 `CMakeLists.txt` 来移除不必要的选项或者替换为更实用的选择项,比如 `RelWithDebInfo` 提供带调试信息的发布版本支持[^2]: ```cmake set(CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo" CACHE STRING "" FORCE) ``` 此更改会强制覆盖内置列表仅保留两个主要模式——开发阶段使用的 Debug 及兼顾性能与诊断能力平衡状态下的 RelWithDebInfo。 --- #### 4. 安装依赖关系处理 针对复杂工程而言,除了基础框架外还需要额外加载第三方资源包(像 dlib 这样的机器学习工具集),因此务必提前完成所有前置条件满足操作。以 Ubuntu 系统为例,在尝试编译之前先执行如下脚本获取必需品及其关联头文件集合[^3] : ```bash sudo apt-get update sudo apt-get install -y cmake libjpeg-dev libpng-dev \ python3-numpy git wget unzip build-essential ``` 接着按照官方文档指示逐步下载预训练模型数据压缩包解压至适当存储区域后再继续后续流程即可顺利完成整个环境搭建过程。 --- ### 总结 综上所述,要解决由于缺失 `CMakeLists.txt` 所引发的相关异常状况可以从以下几个方面入手:一是核实是否存在对应描述性文本;二是合理规划相对引用链路关系;三是依据具体应用场景定制化参数设定最后再辅以外部扩展模块辅助功能增强整体稳定性表现水平达到预期效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值