草庐IT

【交叉编译踩坑指北(一)】windows10下Vscode与Cmake编译生成文件

刘清帆 2023-09-01 原文

1、工具链安装

  工具链版本如下

C:\Users\Lenovo>cmake -version
cmake version 3.24.2

C:\Users\Lenovo>mingw32-make -v
GNU Make 4.2.1 Built for x86_64-w64-mingw32

  若没有以上工具则进行安装,将bin文件加入到环境变量中,注意:有的交叉编译器在安装时选择自动加入环境变量可能并不会加入,还是需要手动加入环境变量,本章首先介绍MinGW编译器,其环境变量如图中所示,位于D盘bin目录下
  该目录下包含了mingw的一系列工具链
  包括mingw的make文件,mingw32-make(在运行makefile时要使用mingw32-make而不是make)

  还有mingw的gcc文件,用于编译.c文件生成可执行文件

  它们的关系是这样的:make用于执行Makefiles,Makefiles中包含了一系列的gcc语句用于编译连接,因此make相当于借助makefiles执行一系列gcc指令的指令。(这里的make代表了一系列的make工具,对于mingw是mingw32-make,对于其他工具可能是其他名字。gcc也同理,这里是x86_64-w64-mingw32-gcc)


  一个小探究,这里发现mingw的bin文件夹下除了x86_64-w64-mingw32-gcc还有一个gcc文件,但当我们在cmd中查看他们各自的版本时发现提示是一样的

C:\Users\Lenovo>gcc -v Using built-in specs. COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=D:/mingw64/bin/…/libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32

C:\Users\Lenovo>x86_64-w64-mingw32-gcc -v Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=D:/mingw64/bin/…/libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32

  应当是都被重定向到了同一个可执行文件


2、安装Vscode插件

C/C++
Cmake
Cmake Tools

3、CMake介绍

  CMake是一个跨平台的Makefile生成工具
  依赖的文件是CMakeLists.txt,其作用简单归结为:

cmake执行CMakeLists.txt生成Makefiles,然后make执行Makefiles,调用Makefiles中一系列gcc编译生成可执行的目标文件

  在这个过程中,make有不同的工具,gcc也有不同的工具,因此在整个工具链中需要进行配置。例如如果是生成windows可执行文件,Cmake就要配置生成MinGW Makefiles,执行Makefiles要选择mingw32-make,编译器要选择x86_64-w64-mingw32-gcc

4、VScode中CMake的使用

shift+ctrl+P:并输入如下指令
cmake:quick start

为本工程开启CMake tools

然后就会看到cmake tools在vscode中的UI
可以点击这里

来进行配置编译器的选择,比如mingw编译器或者arm交叉编译器

5、操作流程(简易版Cmake,无文件层次)

5.1创建文件夹并在VScode中打开

  在桌面上新建了一个空文件夹test_hello,并在VScode中打开文件夹

5.2创建文件hello.c

hello.c

#include<stdio.h>
int main(){
    printf("HELLO\n");
    return 0;
}

5.3创建文件CMakeLists.txt

CMakeLists.txt

#cmake使用#注释
cmake_minimum_required(VERSION 3.0)#指定最低版本,不超过前面查看的当前版本
project(hello_simple)#指定当前项目名称
add_executable(hello hello.c)#指定生成目标、源文件

5.4配置VScode插件CMakeTools选项

进入用户设置


选择CMakeTools设置



可以看到生成文件的默认目录是会在当前文件夹下创建一个build文件夹,生成文件都生成在这个build文件夹中



此外还有源代码目录选择,这个和build一样,都先默认不设置




CMake生成器(Generator)配置。
CMake不编译或链接任何源文件,它使用生成器为构建系统创建配置文件。
相当于在终端(cmd或者powershell)中输入cmake -G后面的参数,例如cmake -G “MinGW Makefiles”

在终端输入

cmake -help

可以看到-G可选参数,其中常见的有这几种。也就是说在上述Cmake:Generator中可选这些生成器,*号表示默认的生成器

5.5开启CMakeTools的UI并选择编译器

shift+ctrl+P

弹出的窗口输入:

cmake:quick start




并点击,会弹出来如下选择
第一次使用时推荐第一个,这个会在本机中扫描编译器和交叉编译器(前提是必须先添加到系统环境变量中,详见本章第一节),特别是遇到BC没出现的情况时,点击A后UI会自动启动,然后在窗口底部的这个位置可以点击选择编译器。
这里选择x86_64-w64-mingw32-gcc 构建windows系统的可执行文件,则生成文件是exe格式的。



点击build进行构建,部分输出如下
可以根据提示知道最后成功构建了可执行文件hello.exe(在build文件下)

由此可知,VScode中的CMakeTools可以一步到位完成构建生成,而不是像终端中那样,先构建生成Makefile,然后再用make指令生产最终可执行文件。


这里稍微拓展一下,如果要在终端进行构建的话,如果前面cmake -G参数选的是MinGw Makefiles,那么后面make指令就要选mingw工具链中的make,即mingw64-make(第一节中所介绍的)指令来执行Makefile,这体现了工具链的对应性和一致性


5.6执行生成文件,观察结果


可以看到,生成文件都在build中,包含了中间文件Makefile,还有目标文件hello.exe等。
直接在终端中cd到build下(输入E: 按下回车可以改变到对应盘符)输入

./hello.exe

结果如下,这里用的是VScode内置powershell
成功输出结果,圆满完成任务!

有关【交叉编译踩坑指北(一)】windows10下Vscode与Cmake编译生成文件的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  4. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  5. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  6. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  7. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  8. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  9. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  10. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

随机推荐