- 博客(18)
- 资源 (3)
- 收藏
- 关注
原创 010.CMake函数和宏(下)
文章目录函数和宏的根本区别同名覆盖总结函数和宏的根本区别函数和宏之间的一个根本区别,是函数引入了一个新的变量作用域,而宏没有。在函数内定义或修改的变量对函数外同名的变量没有影响,而宏与其调用者共享相同的变量范围。但是请注意,函数不会引入新的策略作用域(cmake_policy)。如前文所述,CMake函数和宏不支持直接返回值,但有专门的命令实现这一目的。set()命令的PARENT_SCOPE关键字可用于修改调用者作用域中的变量,而不是函数中的局部变量。虽然这与从函数返回值不同,但它确实允许将一个值(
2021-06-11 06:34:39
308
1
原创 Qt里使用sql,需要把sqldrives文件夹放在plugins里面
这个问题还未定论,但目前来看是这样的。使用windeployqt复制过来的sqldrives文件夹并没有放在plugins文件夹里面而是单独放置。此时当一个依赖sql相关类的dll,就会找不到sqldrives。但放进plugins就好了。exe不会有这个问题。不知道为啥,也不知道是不是这个原因,只是碰巧遇见了这么个解决办法,权且一记。...
2021-06-11 01:28:25
286
原创 009.CMake函数和宏(上)
就像它们在其他编程语言中的角色一样,函数和宏是开发人员扩展CMake功能、封装重复任务的主要机制。它允许开发人员定义可重用的CMake代码块,这些代码块可以像常规的内置CMake命令一样调用。它们也是CMake自己模块系统的基石(后文再说)。
2021-06-10 06:40:24
425
原创 008.CMake子目录项目
文章目录add_subdirectory()命令相关变量作用域include()命令相关变量return()命令总结对于简单的项目,使用单个文件夹是可以的,但复杂项目往往要按照模块进行拆分,这就需要划分不同的子目录。CMake提供了两种机制来实现这一目标,一个是add_subdirectory()命令,一个是include()命令。这两个命令有很大的区别,一定要仔细区别。add_subdirectory()命令add_subdirectory()命令允许项目将另一个目录引入到生成树中。该目录必须有自己
2021-06-07 21:40:26
1389
原创 007.CMake流程控制
依据某些条件,执行某些步骤,是CMake项目的一个常见需求。例如,项目可能希望仅对特定编译器或为特定平台构建时使用某些编译器标志。CMake提供了条件和循环来进行流程控制,和很多编程语言是差不多的。...
2021-06-07 06:10:26
246
原创 静态库不要__declspec(dllimport)和__declspec(dllexport)
在使用一个开源库的时候,发现编译成静态库就链接不上去,说是找不到符号。找了半天原因,发现是头文件的问题。在使用静态库的时候,需要把定义为__declspec(dllimport)的宏重新定义成空。蛋疼。...
2021-06-06 06:23:21
1170
原创 006.CMake变量(下)
调试变量在前文的演示中,使用了message()命令,该命令可以将变量的内容输出,类似于C语言里的printf函数。其完整的命令形式为:message([mode] msg1 [msg2]...)msg可以给出多个,但会合并在一起当做一个字符串输出。需要注意的是mode参数,其可取的关键字如下所示:STATUS:一般的状态信息,前面通常以两个连字符开头。WARNING:警告信息,通常会以红色显示,不会中断处理。AUTHOR_WARNING:和WARNING相似,但只会在允许输出开发者警告信息时
2021-06-06 04:16:39
462
原创 005.CMake变量(上)
变量是CMake完成任务的基石,尽管这一基石正越来越多的被属性所取代,但直到现在位置,变量的作用是毋庸置疑的。实际上,在整个CMake的工作逻辑中,CMakeLists.txt文件描述的核心内容就是项目的状态。**以变量的形式将这种状态保存下来,是最直观的方式。**当然现在CMake采用了更加容易理解的面向对象的组织方式,以各种对象(构建目标、目录、文件等)和对象的属性将状态组织起来,这在后面的文章中会介绍。普通变量使用如下命令设置变量:set(varName value... [PARENT_SCO
2021-06-04 22:48:36
216
原创 004.CMake构建目标的小练习
前文说了如何使用add_executable()和add_library()命令定义对应的目标,本文建立一个玩具项目,进一步演示其用法。HelloWorld项目与hello.exe新建一个CMake目录,并在其中建立一个source目录,在其中新建一个main.cpp和CMakeLists.txt文件。其目录结构如下:main.cpp内容:#include <iostream>int main(int argc, char** argv){ std::cout <&l
2021-06-04 18:14:33
569
原创 003.CMake构建目标初步
构建目标是CMake中非常重要的一个概念,所谓的现代CMake,可以认为就是所有命令都是围绕着构建目标来打转的。前文使用的add_executable()命令,便是定义了一个可执行文件目标,除此外CMake还支持各种类型的库目标,比如静态库(Static)、动态库(shared)、模块库(modules)、框架库(frameworks),并且可以非常方便的描述这些目标之间的依赖关系,以决定后续的链接步骤。可执行文件目标前文已经提到,定义该类目标的命令如下:add_executable(targetN
2021-06-03 01:10:44
433
原创 002.CMakeLists.txt文件初步
所有的CMake项目都以一个名为CMakeLists.txt的文件开始,它应该放在源代码树的顶部。它定义了从源代码和目标到测试、打包和其他定制任务的所有构建内容。这种定义的能力,来自于CMake自己的语言。CMake语言有许多程序员熟悉的东西,比如变量、函数、宏、条件逻辑、循环、代码注释等等。这些概念和特性将在接下来的文章中介绍。下面内容是一个简单的CMakeLists.txt文件,只包含三行,用以生成一个基本的可执行文件。cmake_minimum_required(VERSION 3.12)pro
2021-05-31 08:23:15
134
2
原创 001.设置项目
一个CMake项目要从一个CMakelists.txt文件开始,该文件定义了应该构建什么、如何构建、要运行什么测试以及要创建什么包。该文件是整个项目独立于平台的描述,之后CMake将其转换为特定构建工具项目文件。需要注意的是,它只是一个普通的文本文件,可以使用任何文本编辑器编辑之。第一个需要了解的概念,便是目录。CMake项目往往要区分源码目录,构建目录。源码目录是工程源码所在的地方,版本控制重点关注此处,CMakelists.txt文件就位于其中。而构建过程中产生的对象则需要放置在构建目录中,包括可执
2021-05-31 07:26:27
275
原创 000.CMake概览
CMake涵盖了从建立项目、构建应用到打包发布的所有内容。它不仅涵盖了从开始到结束的过程,还支持不同的平台、工具和语言。了解CMake的整体逻辑对使用CMake很有帮助,简单来讲,在CMake看来,项目从开始到结束的过程看起来像这样:首先是一个通用的项目描述,生成特定于构建平台的项目文件,比如make,VS,Xcode等,这一阶段是CMake最出名的地方。CMake同时提供了CTest和CPack,分别用于管理后期的测试和打包阶段。从开始到结束的整个过程可以完全由CMake来驱动,测试和打包步骤可以
2021-05-31 06:34:25
104
原创 05-语法规则的定义(1)
基本规则[],任意一个[]内的字符,比如[0-9]表示任意一个数字~[],任意一个不是[]内的字符,比如 ~[0-9]表示不能为数字。+,表示之前的字符,至少有一个,比如[a-z]+表示任意英文字母串。*,表示之前的字符,可以0个,可以多个。比如[a-z]*表示可以0个字母,也可以表示一个字母串。[1-9][0-9],表示一个数,如123。其首位不能为0。\t,tab键。\r,回车键。\n,换行符。windows下一个换行是用\r\n表示的。空白符往往使用[ \r\n\t]表示,第一个是空
2021-04-20 01:46:26
462
原创 04-语法的调试
前面三篇文章,已经介绍了使用antlr分析结构化文本数据的完整流程。接下来我们将进一步深入语法定义这一部分。调试工具如果每修改一处语法,就需要经历整个cpp项目编译流程的话,那耗费的精力就太多了。所以官方提供了几个语法的调试工具。第一个是插件型的,有idea插件,有vscode,vs的等,可以根据情况下载使用。我自己的电脑上有idea的,其界面如下:第二种是Antlr工具包自带的,使用也比较简单,只不过需要手动生成java目标文件并编译成class文件,然后才能测试。为了方便,这里使用自带的调试
2021-04-20 01:05:52
154
原创 03-编译小Parser
可以使用很多工具编译之,因为我们的运行时库是VS构建的,为了不出问题也为了操作简单,仍旧使用VS建立项目。建立工程创建一个TestL的Cpp空项目,并将Cpp文件复制到工程文件中去。注意只要cpp和h文件就可以,其他的辅助文件不需要。然后将所有的文件添加到工程中。新建一个main.cpp文件,写一个做简单的helloworld程序,如下:#include <iostream>int main(int argc, char** argv) { std::cout << "
2021-04-19 23:13:20
332
9
原创 02-结构化文本、解析规则与目标文件
简单的结构化文本为了简单起见,我们定义一种特别的格式,该格式包含三种成分,分别为Name,Age,Height。并按照如下所示的格式组织起来:Name{小明}Age{18}Height{175}Name{小强强}Age{23}Height{173}...我们需要识别出这些数据,并做出特殊的响应。定义解析规则这是一种非常简单的文本数据,其规则定义也非常简单。新建一个规则文件,命名为TestL.g4。并将以下内容复制进去。grammar TestL;doc: (NAME '{' STRI
2021-04-19 21:26:13
734
c语言游戏编程
2012-04-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人