| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> VSCODE + MinGW(cmake) 配置C++编译调试环境创建demo静态库动态库(以及附带常用makelist设置) 傻瓜一站式教程 解决中文乱码问题 -> 正文阅读 |
|
[开发工具]VSCODE + MinGW(cmake) 配置C++编译调试环境创建demo静态库动态库(以及附带常用makelist设置) 傻瓜一站式教程 解决中文乱码问题 |
关于本帖的各个模块组成先解释一下 ?vscode本质上是个编辑器,只能用于编辑文本,本体功能类似于notpad++,它并不是个像 vs那样的集成开发环境,MinGW是将g++等一系列用于在linux上编译c/c++的编译器适配到windows平台的编译器,windows平台有自己的编译器叫msvc不过用vscode的人一般不用msvc cmake是用于生成makelist文件的构建器,makelist的作用是简化makefile的书写. 编译程序最终调用的是make指令,这个对应的是makefile,makefile可以人为书写,不过语法相对难懂,可以通过cmake生成的makelist来自动生成makefile,makelist的语法就简单多了 这里附上一篇个人感觉很全的cmake教程(虽然我本人也并没有全部看完) 好了知道上面的模块了,就可以进入主题了(关于如何安装vscode跟配置minGW的环境变量这个我就不写了,网上太多了),这里说几个vscode插件 C/C++? Cmake Tools必须安装,其余的随意,有些插件就是改变了目录的颜色,这些可以自己去找找,跟本文主旨无关 首先声明,本人使用vscode编译C++时间甚短,关于vscode的很多配置不是很明白,不过以下的示例都经过验证,可帮助小白快速入手 一简易使用篇: 直接使用g++指令编译程序如图: ?将如下代码拷贝到新建的cpp文件内
此时你的工作区应该是这样的(除了.vscode文件夹) ?关于这个.vscode文件夹其实不必太过关心,用多了自然就知道是干嘛的,主要就是存放launch.json,tasks.json等启动,调试,任务文件的. 下面手动创建.vscode目录 ?然后将如下文件复制到.vscode目录下(文件名不要出错) ?c_cpp_properties.json (修改compilerPath)
launch.json (注意program,cwd,miDebuggerPath)
tasks.json(注意command, options)
这几个文件大概的功能这里说明一下 C_Cpp_Properties.json是用于配置编译器环境的,包括启动器代号、位数(这些是自定义的)、编译选项、启动设置、编译模式等。includePath指向C/C++标准库、用户头文件所在位置。 launch.json是vscode用于调试的配置文件,比如指定调试语言环境,指定调试类型等等,这个文件在首次运行F5(跟vs相同的调试指令)时会让你创建该文件 tasks.json 这个配置文件是用来执行你预定的任务的,比如说你修改了你的代码,调试之前,肯定要重新生成新的程序后再调试,那么你就可以配置它告诉vscode怎么重新生成这个新的程序 vscode就是先跑 tasks.json 任务,再跑 launch.json。 下面就运行tasks.json, (组合键 ctrl + shift?+ p? 或者直接F1键) ?这里的g++就是tasks.json的lable的名字 ?可以看到生成了test.exe文件 下面进行调试,直接F5进入调试(记得打断点) 以上 二项目篇 cmake构建项目这里准备做的是创建一个dll项目,一个demo项目,使用demo调用dll的导出函数,当然了,不想看dll的可以略过部分内容 好了跟上面一样先创建一个目录用于存放demo跟dll文件夹,我这里创建的是wook6,参照上面的方法,先给wook6文件夹添加工作区,然后在wook6文件夹里面创建bin目录,demo目录,dll目录,此时的工作区如下(除了.vscode目录) 这时候在wook6目录下,也就是在wook6工作区中存在bin,demo,dll三个文件夹,由于vscode的命令面板执行的各种任务仅能在当前工作区生效,因此为了让demo项目在demo文件夹下生成,dll项目在dll文件夹下生成,需要为demo,dll文件夹分别添加工作区,添加工作区的方法如下 ?上面的步骤执行结束后,vscode的目录如下 ?那么现在发生什么事了呢,可以通过 ctrl + r 切换工作区,现在把工作区切换回wook6 ?此时的目录如下 ?这样一来就可以通过切换工作区的方式来指定vscode当前的工作目录 好了,按照这个方法,把demo文件夹也添加工作区 下面开始通过cmake构建demo项目ctrl+ r 进入 demo工作区,F1或者 ctrl + shift + p 打开命令面板 ,选择cmake入门 选择你配置的mingw GCC编译版本 ?输入项目名字,这里是demo ?选择下面Executable ,创建exe程序,上面这个library是用于创建链接库程序,如lib库跟dll库 ?执行完上面的步骤后目录应该如下 ?这个目录下面的文件由cmake构建创建,CmakeLists.txt就是cmake的语法文件,用于生成makefile文件的(此时没有.vscode目录没关系),现在cmake已经为我们构建出项目了,接下来要做的就是执行cmake指令,编译出我们的程序 main.cpp就是本项目唯一的源文件,里面就是默认的 打印hello world,没什么可多说的 如何执行cmake指令呢 通过F1或者组合键打开命令面板,选择配置任务 ?在列表最下面找到使用模板创建tasks.json文件 ?选择maven ?此时在demo目录下面会生成.vscode目录,且在该目录下有tasks.json文件 看看此时的tasks.json文件内容是什么 ?这内容并没什么用,不过这个文件有用,vscode通过检索.vscode目录下的tasks.json文件来执行指令,label就是指令的名字,下面将如下语句替换到 label : test 的 command下
?此时应为 ?可以看到tasks.json中使用的类型是shell,准确的说是windows下的powershell,所以command后面加的就是powershell的指令,这条指令什么意思呢,就是进入当前工作区的build目录,删除CMakeFiles文件夹,然后执行cmake根据当前目录配置生成makefile,再调用make指令执行makefile文件构建项目,关于这条指令可能会出现错误的地方是 删除文件夹部分,这个自己根据shell还是cmd自行修改 可以看到我上面把任务的名字改成了test-demo-build,下面就执行这个任务 还是通过命令面板 ? ?这两个任务就是在tasks.json中配置的,不过因为我们只配置了一个任务,另一个任务目前是无意义的,选择执行test-demo-build ?下面验证下生成的demo.exe是否可以运行,当然了有两种方法 一是直接在命令行执行,如下,右击build目录,将其在集成终端打开 可以看到vscode为我们新起了一个powershell终端,且运行目录也在build下 ?输入 ./de 之后可通过tab键补全名称,回车键确认,执行完是这样 ?注意,ps是powershell的简称 可以看到生成的demo.exe文件可以执行,当然了最粗暴的方式是直接在文件夹下双击运行,不过默认的main.cpp没有加暂停功能,运行程序会一闪而过,想要通过此方式查看运行效果可以在main.cpp中添加 system("pause")代码,不过添加该代码后在命令行运行会出现无法关闭demo.exe的bug,如果出现该bug可在任务管理器里强制关闭demo.exe进程,当然了这些都是题外话,是我遇到的一些坑,你不一定会遇到,不知道也没关系 二调试执行demo.exe程序 ?通过该步骤可以生成launch.json文件,将如下复制粘贴,需注意miDebuggerPath
好了现在可以调试程序了,vscode跟vs的调试命令完全一样,通过F5调试 ?可以看到调试成功,vscode进入断点 好了以上关于demo项目的配置就全部结束了,注意,目前的编译,调试都是在demo的工作区内完成的,下面要切换工作区到dll 通过ctrl + r切换工作区 通过cmake构建dll项目构建dll跟构建demo项目基本一样,这里只用文字说明进行了那些步骤,具体执行后的结果可参照demo的构建 首先确认当前的工作区已经切换到dll目录,F1(ctrl + shift + p)打开命令面板,选择CMake:快速入门, 输入项目名字,dll,选择创建library项目 ?此时项目应该如上 如果你知道C++的链接库知识应该会产生疑惑,C++的链接库分为两种,一种是lib(a)库,也就是静态库,采用的是编译时链接,仅能在C/C++语言内部使用, 一种是dll(so)库,也就是动态库,采用的是运行时链接,支持其他多种语言调用,我们这里创建的是dll,为什么没有什么设置之类的,如何确定生成的是动态库呢,好带着这个疑问接下去慢慢看 如果熟悉C++链接库的知识,应该知道,C++链接库有两种链接方式,其中一种隐式调用链接库的方式就需要有库的头文件,目前的项目里面仅有一个cpp源文件,因此还需手动创建一个头文件(如果用显示调用方式则不需要头文件,但是需要用到loadlibaray,getaddress之类的函数获取接口的地址) 下面创建dll.h头文件,内容如下
接下来通过命令面板,给dll项目添加tasks.json,步骤跟创建demo项目时一样? : F1 -> 任务:配置任务 ->使用模板创建tasks.json文件 -> maven 将cd ${workspaceFolder}/build ; Remove-Item -r CMakeFiles ; cmake .; make 替换进去,如下 ?运行这个test? task(在命令面板 -> 任务:运行任务->test),然后去build目录下找生成的文件,如下图 ?? ?可以看到此时生成了一个后缀式.a的文件,说明这是生成了静态库文件,既然生成了,那就调用一下看看这个文件能不能使用吧 将工作区切换到wook6,即最开始的目录下,如图 ?如何让demo调用dll生成的库文件呢,下面需要修改demo项目的cmakelists,内容如下
上述设置了demo项目将要使用的库目录,库文件目录以及链接库命令 在demo项目的main.cpp文件中修改如下
下面将工作区切换到demo,F1运行编译任务,在F5运行调试任务,具体运行结果如下 上面表明demo调用dll生成的静态库文件成功 那么问题来了,我需要生成的是动态库,这里为什么生成的是静态库呢,下面通过修改cmake指令编译生成动态库 指定dll项目为动态库项目好了现在将工作区切换到dll 修改dll的cmakelist如下
注意cmake默认生成静态库项目,动态库需显式指定 下面执行dll的编译task,结果如下 ?好了现在问题来了,为什么出现了两个.a文件,一个.dll文件 ,还有为什么是.a 先说为什么是.a? .a .so是linux系统下的库后缀名,分别对应windows下的.lib,.dll ,因为这里使用minGW进行编译的原因,该平台移植自linux,所以中间文件沿用的.a后缀,可以看到最终文件动态库使用的是.dll,因为.a文件在编译时被链接进程序,成为程序的代码,可以不明确区分操作系统版本,只要你的编译器认识就行,而在运行过程中,需要操作系统去加载动态库,所以这里还是以windows认识的.dll后缀作为动态库文件名 这涉及到链接库的知识,这里简单说明一下: 动态库在被链接时有两种方式,具体的调用方法参考如下链接??动态库库的两种链接调用方式 可以看到,动态库也有一个相应的.lib库,这个库准确的讲不能叫静态库,叫动态库导入库,里面仅有动态库的符号表及函数地址,跟真正的静态库完全不同 好了上面生成了动态库,下面还是把工作区切换到demo,仅需修改makelist中链接库的名字即可 执行编译指令,生成成功 注意,动态库的使用需要将dll文件放置到demo.exe同一目录层级,将libdll.dll拷贝到demo.exe目录 ?F5执行launch任务,如下 ?上述表示demo调用动态库文件成功,并对demo进行了调试 好了现在本教程已经完成了绝大部分了,还有最最重要的一步,调试动态库 最后一步,调试动态库调试动态库需要稍微修改demo代码以便于让调试器可以附加进入demo程序,修改后如下
好了修改完后进行编译任务,并F5运行一下,可以看到如下问题 中文出现乱码,这是编码问题,vscode默认使用UTF-8编码,而windows的cmd窗口默认使用本地编码,因为我切换了windeos语言为中文系统,所以默认的是ANIS码,也就是GBK,虽然从主流上讲,使用UTF编码更适合跨平台项目(多数平台默认宽字符编码UTF-8),不过国内的软件开发多数使用的编码仍然是GBK,关于GBK,GB2312 ,GB18030,只要知道是后者兼容前者 下面给makelist添加如下设置 #设置以本地GBK编码编译程序,解决中文乱码问题 为什么这样设置,选择打开任何带有代码的文件,可以看到如下 ?说明vscode默认使用UTF编码来保存文件,上述第一条就是告诉编译器,编译文件编码全部是GBK? ? ??设置编码参考 下面那条命令告诉编译器将生成文件的所有输出改成GBK编码 将main.cpp编码改成GBK 如此设置后如下图 接下来运行编译任务和调试任务 ?好了,现在demo已经改好了,下面要对动态库进行调试 将工作区切换到dll 在.vscode中创建launch.json文件,内容如下
dll调试实在难以搞定,暂无教程 附录: 常用的cmake指令 #设置c++编译器 #CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置; #设置可执行文件的版本为debug还是release
#[[命令:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
#2、设置cmake编译语言 project(dllTest VERSION 0.1.0) #设置c++编译器 #6、WIN特有的bug,windows.h会定义下面两个宏,导致std::min和std::max用不了,所以要添加
#链接库的目录,可用相对路径 #CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置;
#链接使用的dll库 ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:05:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |