如何解决有人可以向我解释这个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 举报,一经查实,本站将立刻删除。