有人可以向我解释这个cmake脚本吗?

如何解决有人可以向我解释这个cmake脚本吗?

| 我觉得整个cmake社区都在吸引我。 “教程”或资源都对我没有任何意义。就像我错过了什么。我认为最让我感到困惑的是语言,而我所见过的任何教程都没有像向一个几乎没有Unix经验的人解释cmake那样体面。 无论如何,我正在使用FireBreath,它广泛使用了cmake,我认为现在是我该开始思考如何使用它而不是直接更改项目文件的时候了。 根CMakeLists.txt文件包含以下内容:
cmake_minimum_required (VERSION 2.6)
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)

Project(${PLUGIN_NAME})

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
    [^.]*.cpp
    [^.]*.h
    [^.]*.cmake
    )

include_directories(${PLUGIN_INCLUDE_DIRS})

# Generated files are stored in ${GENERATED} by the project configuration
SET_SOURCE_FILES_PROPERTIES(
    ${GENERATED}
    PROPERTIES
        GENERATED 1
    )

SOURCE_GROUP(Generated FILES
    ${GENERATED}
    )

SET( SOURCES
    ${GENERAL}
    ${GENERATED}
    )
如果有人可以向我解释每一行,我将非常感激。特别是
${GENERAL}
${GENERATED}
是什么。     

解决方法

首先,cmake语法非常简单。它由\“ commands \”和\“ arguments \”组成。它是如此简单,以至于需要一段时间才能沉入其中。一切都是\“ command(arguments)\”。此外,命令名称不区分大小写。以前它们必须全部为大写,但是从2.6版开始(我认为)就没有关系了。但是,参数区分大小写。
cmake_minimum_required (VERSION 2.6)
此命令为项目设置cmake的最低要求版本。如果cmake的当前版本低于2.6,它将停止处理并报告错误。这样就不必支持该工具的旧版本。
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)
将变量CMAKE_BACKWARDS_COMPATIBILITY设置为值2.6。实际上,这是您所呈现的CMakeLists.txt文件中的一个小错误,因为CMAKE_BACKWARDS_COMPATIBILITY不适用于2.6及更高版本。该脚本可能应使用
cmake_policy
。这是为了指定新版本的cmake在遇到先前版本的cmake中的不一致时应如何表现。您今天从头开始编写的任何脚本都无需为此担心。
Project(${PLUGIN_NAME})
将项目名称设置为变量“ 7”中任何值。在某些IDE中,此值显示为项目名称。要将值写入变量,可以使用
set(PLUGIN_NAME myName)
,并使用
${}
语法(
\"${PLUGIN_NAME}\"
)读取值。有些命令也可以写入变量,但是您使用它们的方式与
set
命令中的相同。
file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
     [^.]*.cpp
     [^.]*.h
     [^.]*.cmake
     )
file
是命令。它的第一个参数
GLOB
表示\“返回磁盘上名称与我将作为参数给出的模式匹配的文件\”。下一个参数
GENERAL
是将结果存储到的变量,就像
set
一样,它将结果写入变量,您以后可以使用
${GENERAL}
读取它。
RELATIVE
,路径表示返回相对于该路径而不是完整路径的文件名。因此,您会得到\“而不是\” C:\\ some \\ long \\ path \\ src \\ foo.cpp \“或\” / home / me / some / path / src / foo.cpp \“ src \\ foo.cpp \“或\” src / foo.cpp \“。变量CMAKE_CURRENT_SOURCE_DIR是CMake为您填充的\“魔术变量\”,它指向当前正在处理的CMakeLists.txt文件所在的源目录的路径。最后一个参数列表是将要匹配的文件的模式。基本上,任何文件扩展名为cpp,h或cmake的东西。
include_directories(${PLUGIN_INCLUDE_DIRS})
将ѭ20中的目录添加到编译器搜索的包含文件中。例如,如果使用gcc编译,这将导致额外的\“-I \”参数。
# Generated files are stored in ${GENERATED} by the project configuration
以#开头的行是注释。
SET_SOURCE_FILES_PROPERTIES(
       ${GENERATED}
       PROPERTIES
           GENERATED 1
       )
文件可以具有与之关联的键/值对,这会影响它们的构建方式。在此,变量“ 2”中列出的文件的属性“ GENERATED \”设置为值1。这是什么意思?好了,CMake现在知道不要在磁盘上查找\“ $ {GENERATED} \”文件,因为它们将在另一个构建步骤中创建。在发布的代码段中,没有人设置变量
${GENERATED}
。我想它会在项目文件的其他位置设置。不要将变量
${GENERATED}
与属性GENERATED混淆!这是一个微妙的观点,也许变量应该为
GENERATED_FILES
以避免混淆,即
SET_SOURCE_FILES_PROPERTIES(${GENERATED_FILES} PROPERTIES GENERATED 1)
 SOURCE_GROUP(Generated FILES ${GENERATED})
这将创建一个组,该组在Visual Studio中转换为一个名为\“ Generated \”的文件选项卡,其中包含变量
${GENERATED}
中的文件。
 SET(SOURCES ${GENERAL} ${GENERATED})
这行代码将变量SOURCES设置为变量
${GENERAL}
${GENERATED}
中的任何值。之前我们将ѭ1设置为当前源目录中的cpp,h和cmake文件的列表。在类似C的伪代码中,这类似于\“ SOURCES = GENERAL + GENERATED \”。作为实现的详细信息,值SOURCES实际上是一个列表,其内容由\“; \”字符分隔。通常这样做是为了以后可以仅使用变量
${SOURCES}
来创建库或可执行文件,而不必在各处重复其他两个变量。     ,有时,我可以理解您对cmake教程的感受。我建议您查看在线文档和一些cmake项目:例如食人魔,Vtk和Kde。 从CMakeLists.txt的外观来看,似乎应该由外部CMake项目(带有add_subdirectory)调用此项目,因为它引用了变量PLUGIN_NAME,PLUGIN_INCLUDE_DIRS和GENERATED。 要回答您的问题:
cmake_minimum_required (VERSION 2.6)
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)
Project(${PLUGIN_NAME})
这将准备您的cmakefile,告诉cmake它必须是2.6或更高版本,并且您正在使用PLUGIN_NAME变量中指定的名称启动项目。
file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
    [^.]*.cpp
    [^.]*.h
    [^.]*.cmake
    )
这部分遍历当前源目录(您的cmakelists.txt所在的目录),并收集所有* .cpp,*。h和* .cmake文件。结果是相对于当前源目录相对应的文件路径的集合/列表,并存储在变量GENERAL中。
# Generated files are stored in ${GENERATED} by the project configuration
SET_SOURCE_FILES_PROPERTIES(
    ${GENERATED}
    PROPERTIES
        GENERATED 1
    )

SOURCE_GROUP(Generated FILES
    ${GENERATED}
    )
显然,会有一组源文件存储在变量GENERATED中(因此不是GENERAL)。如果是生成生成的源文件,则在CMake的第一个生成中不一定存在这些文件,而CMake将需要知道这些文件是生成的。使用set_source_files_properties命令,它们将获得\“ generated \”属性,这是CMake进行正确的依赖性检查所必需的。
SET( SOURCES
    ${GENERAL}
    ${GENERATED}
    )
因此,现在我们有了来自file(GLOB ...)调用的一组源文件,这些源文件存储在变量GENERAL中。我们有一组soruce文件存储在变量GENERATED中,该变量在其他地方创建。将这两个集合合并为一个源文件列表,并将其存储在变量SOURCES中。 在正常情况下,我希望有一个add_library调用:     add_library($ {PLUGIN_NAME} {SOURCES}) 这向Cmake指定要从SOURCES中的源文件创建和构建新的库。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-