jjzjj

记录一次Win下的C++环境搭建(VSCode+MinGW+Clangd+xmake)

_acct 2023-03-28 原文

这套环境是VSCode+MinGW(MSYS2)+Clangd+Xmake的配置。

MinGW

网上很多教程引导去的MinGW-w64 gcc版本只更新到了8.1.0就停更了,而实际中gcc版本已经到达12了,因此我们使用MSYS2去安装GCC。

首先使用scoop安装msys2(在main bucket中就有):

scoop install msys2

终端中输入msys2进入环境,下载minGW:

pacman -S mingw-w64-x86_64-toolchain

下面会提示选择哪些工具,如果不是硬盘空间实在有限的话,直接回车默认安装全部即可。

随后找到minGW的bin目录(这里推荐一手Listary,直接搜索g++.exe打开文件目录即可,非常方便),添加环境变量,此时GCC编译器就算是安装成功了。

clangd

这个是花费了我最多精力的地方,有一说一,clangd在代码提示补全上确实吊打vscode自带的C/C++扩展,但是在Windows上的配置费了一番功夫

在vscode扩展商店中搜索clangd下载,完成后右下角会弹窗提醒你安装clangd server,点击Install即可直接安装,这一点非常便捷,clangd默认直接绑定了VS路径下的MSVC库,如果需要修改为MinGW则要改动target。

配置如下:

{
    "clangd.arguments": [
        "--header-insertion=never",
        "--completion-style=detailed",
        "--query-driver=D:\\6-EnglishPathSoftwates\\ScoopUser\\apps\\msys2\\2022-06-03\\mingw64\\bin\\g++*"
    ],
    "clangd.fallbackFlags": [
        "-std=c++14",
        "-I${workspaceFolder}/src/includes",
        "--target=x86_64-w64-windows-gnu"
    ]
}

逐一解释:

  • header-insetion:是否自动引入头文件,这里设置的是从不。
  • completion-style:设置提示格式,这里设置的是展示所有细节。
  • query-driver:设置clangd server的驱动库路径,这里我设置了mingw的路径,但似乎没有效果(clangd仍然链接到了MSVC当中)
  • std:设置c++标准
  • -I:设置用户自定义的库路径
  • --target:设置链接目标,这里改成了GNU,即对应MinGW

学习C++ Primer这本书的需要注意一下,虽然全书是按照C++11标准写的,但是这里如果设置成C++11,clangd会书中的附带代码报错(比如Sales_item.h)。

xmake

这是前段时间发现的一个新的构建工具(也不算新了,好像已经release两年了),用的是lua脚本,在我学习C++Primer的过程中感觉比cmake更加简洁易懂,用它管理我写的习题集非常轻松。贴一段xmake的配置代码:

target("E632")
    set_kind("binary")
    add_files("src/chapter6/e632.cpp")

target("E633")
    set_kind("binary")
    add_files("src/chapter6/e633.cpp")

target("E642")
    set_kind("binary")
    add_files("src/chapter6/e642.cpp")

target("E644")
    set_kind("binary")
    add_files("src/chapter6/e644.cpp")

这款工具也可以在scoop中直接下载,vscode也提供了官方插件快速操作(不过我觉得命令行已经够傻白甜了),推荐大家使用。

同时它也可以根据lua脚本直接生成CmakeList文件(也就是向下兼容Cmake),这个功能我没有深入体验过,感兴趣的可以尝试一下。

有关记录一次Win下的C++环境搭建(VSCode+MinGW+Clangd+xmake)的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  4. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  8. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  9. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

  10. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

随机推荐