购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 搭建Windows下Linux C/C++开发环境

2.3.1 Windows下非集成式的Linux C/C++开发环境

由于很多程序员习惯使用Windows,因此我们这里采取在Windows下开发Linux程序的方式。基本步骤就是先在Windows用自己熟悉的编辑器写源代码,然后通过网络连接到Linux,把源代码文件(c或cpp文件)上传到远程Linux主机,在Linux主机上对源代码进行编译、调试和运行,当然编译和调试所输入的命令也可以在终端工具(比如SecureCRT)里完成,这样从编辑到编译、调试运行都可以在Windows下操作了,注意是操作(命令),真正的编译、调试运行工作实际都是在Linux主机上完成的。

Windows下的编辑器很多,大家可以根据自己的习惯来选择使用。常用的编辑器有VS Code、Source Insight(简称SI)、UltraEdit(简称UE),它们小巧且功能多,具有语法高亮、函数列表显示等编写代码所需的常用功能,对付普通的小程序开发绰绰有余。但笔者推荐大家使用VS Code,因为它免费且功能更强大,而后两者是要收费的。

用编辑器写完源代码后,就可以通过网络上传到Linux主机或虚拟机Linux,把文件从Windows传到Linux的方式也很多,既有命令行的sz/rz,也有FTP客户端、SecureFX等图形化的工具,大家可以根据习惯和实际情况选择合适的工具。如果使用VS Code,可以自动上传到Linux主机,非常方便。本书后面对于非集成式的开发,用的编辑器都是VS Code。

把源代码文件上传到Linux下后,就可以进行编译了,编译的工具可以使用gcc或g++,两者都可以编译C/C++文件。编译过程中如果需要调试,可以使用命令行的调试工具gdb,后面会详细阐述。下面介绍一个在Windows下开发Linux程序的过程。关于gcc、g++和gdb的详细用法这里就不再赘述了,其详细用法可以参考《Linux C与C++一线开发实践》。

例2.2 】 第一个VS Code开发的Linux C++程序。

(1)到官网https://code.visualstudio.com/下载VS Code,然后安装。

(2)如果是第一次使用VS Code,先安装2个和C/C++编程有关的插件,单击左方竖条工具栏上“Extensions”图标或者直接按快捷键Ctrl+Shift+X切换到Extensions页,该页主要是用来搜索和安装(扩展)插件的,在左上搜索框中搜索“C++”,然后安装两个C/C++插件,如图2-43所示。

分别单击“Install”按钮开始安装,安装完毕后,代码的语法就高亮了,也有函数定义跳转功能了。接着再安装一个插件,该插件能实现在VS Code中上传文件到远程Linux主机上,这样就不必切换软件窗口了。搜索“sftp”,安装第一个,如图2-44所示。

图2-43

图2-44

单击“Install”按钮,重启VS Code。

(3)在Windows本地新建一个存放源代码文件的文件夹,比如E:\ex\test\。打开VS Code,单击菜单“File”|“New Folder”,此时将在左边显示Explorer视图,在视图的右上方单击“New File”图标,如图2-45所示。

图2-45

然后下方会出现一行编辑框,用于输入新建文件的文件名,输入“test.cpp”,然后按Enter键,此时会在VS Code中间出现一个编辑框,输入代码如下:

     #include <iostream>
     using namespace std;
     int main(int argc, char *argv[])
     {
        char sz[] = "Hello, World!";
        cout << sz << endl;
        return 0;
     }

如果前面2个C/C++插件安装正确的话,可以看到代码的颜色是丰富多彩的,这就是语法高亮。如果把鼠标停留在某个变量、函数或对象上(比如cout),还会出现更加完整的定义说明。

另外,如果不准备新建文件,而是要添加已经存在的文件,可以把文件放到当前目录下,然后在VS Code中的Explorer视图就能马上看到了。

(4)上传源文件到虚拟机Linux。我们用SecureCRT自带的文件传输工具SecureFX把test.cpp上传到虚拟机Linux的某个目录下。SecureFX的用法前面已经介绍过了,这里不再赘述。这是手动上传方式,有点烦琐。在VS Code,我们可以下载插件sftp,实现在VS Code中就能同步本地文件和服务器端文件。使用sftp插件前,我们需要进行一些简单设置,告诉sftp,我们远程的Linux主机的IP地址、用户名和口令等信息。我们按快捷键Ctrl+Shift+P后,会进入VS Code的命令输入模式,然后可以在上方“Search settings”框中输入sftp:config命令,会在当前文件夹(这里是E:\ex\test\)生成一个.vscode文件夹,里面有一个sftp.json文件,我们需要在这个文件中配置远程服务器地址,VS Code会自动打开这个文件,输入内容如下:

     {
        "name": "My Server",
        "host": "192.168.11.129",
        "protocol": "sftp",
        "port": 22,
        "username": "root",
        "password": "123456",
        "remotePath": "/root/ex/3.2/",
        "uploadOnSave": true
     }

输入完毕,按快捷键Alt+F+S保存。其中,/root/ex/3.2/是虚拟机Ubuntu上的一个路径(可以不必预先建立,VS Code会自动建立),我们上传的文件将会存放到该路径下。host表示远程Linux主机的IP地址或域名,注意这个IP地址必须要和Windows主机的IP地址相互ping通;protocol表示使用的传输协议,用SFTP,即安全的FTP协议;username表示远程Linux主机的用户名;password表示远程Linux主机的用户名对应的口令;remotePath表示远程文件夹地址,默认是根目录/;uploadOnSave表示本地更新文件保存会自动同步到远程文件(不会同步重命名文件和删除文件)。另外,如果源码在本地其他路径,也可以通过context设置本地文件夹地址,默认为VS Code工作区根目录。

在Explorer空白处右击,选择快捷菜单“Sync Local”|“Remote”,如果没有问题,可以在Output视图上看到如图2-46所示的提示。

图2-46

这说明上传成功了,另外,如果Output视图没有出现,可以单击左下方状态栏上的小图标“SFTP”,如图2-47所示。

图2-47

此时如果到虚拟机Ubuntu上查看,可以发现/root/ex/3.2/下有一个test.cpp了:

     root@tom-virtual-machine:~/ex/3.2# ls
     test.cpp

(5)编译源文件。现在源文件已经在Linux的某个目录下(本例是/root/ex/3.2/)了,我们可以在命令行下对其进行编译了。Linux下编译C++源程序通常有两种命令,一种是g++,另外一种是gcc,它们都是根据源文件的后缀名来判断是C程序还是C++程序。编译也是在SecureCRT的窗口下用命令进行,打开SecureCRT,连接远程Linux,然后定位到源文件所在的文件夹,并输入g++编译命令:

     root@tom-virtual-machine:~/ex/3.2# g++ test.cpp -o test
     root@tom-virtual-machine:~/ex/3.2# ls
     test  test.cpp
     root@tom-virtual-machine:~/ex/3.2# ./test
     Hello, World!

-o表示输出,它后面的test表示最终输出的可执行程序名字是test。

如果要用gcc来编译,gcc是编译C语言的,默认情况下,如果直接编译C++程序,会报错,我们可以通过增加参数-lstdc++来编译,结果如下:

     root@tom-virtual-machine:~/ex/3.2# gcc -o test test.cpp -lstdc++
     root@tom-virtual-machine:~/ex/3.2# ls
     test  test.cpp
     root@tom-virtual-machine:~/ex/3.2# ./test
     Hello, World!

其中-o表示输出,它后面的test表示最终输出的可执行程序名字是test;-l表示要连接到某个库,stdc++表示C++标准库,因此-lstdc++表示链接到标准C++库。

前面我们上传文件是通过右击菜单来实现,还是有点烦琐。现在我们在VS Code中打开test.cpp,稍微修改点代码,比如sz的定义改成:char sz[] = "Hello, World!--------",然后保存(按快捷键Alt+F+S)test.cpp,此时VS Code会自动上传到远程Linux上,Output视图里也会有新的提示,如图2-48所示。

图2-48

其中,file-save表示文件保存,local->remote表示上传到远程主机。读者只要保存源码文件,VS Code就自动上传。此时再到编译,可以发现结果变了:

     root@tom-virtual-machine:~/ex/3.2# gcc -o test test.cpp -lstdc++
     root@tom-virtual-machine:~/ex/3.2# ./test
     Hello, World!--------

顺便提一句,代码后退的快捷键是Alt+←。

2.3.2 Windows下集成式的Linux C/C++开发环境

所谓集成式,简单来讲就是代码编辑、编译、调试都在一个软件(窗口)中做完,不需要在不同的窗口之间切换来切换去,更不需要从一个系统(Windows)手动传文件到另外一个系统(Linux)中,传文件也可以让同一个软件来完成。这样的开发软件(环境)称为集成开发环境(Integrated Development Environment,IDE)。

Windows下也有能支持Linux开发的IDE,在Visual C++ 2017上全面支持Linux的开发。Visual C++ 2017简称VC2017,是当前Windows平台上最主流的集成化可视化开发软件,功能非常强大。其界面和使用不再赘述,建议读者参考清华大学出版社出版的《Visual C++ 2017从入门到精通》。

在VC2017中,可以编译、调试和运行Linux可执行程序,也可以生成Linux静态库(即.a库)和动态库(也称共享库,即.so库)。但前提是在安装VC2017的时候要勾选支持Linux开发的组件,默认是不勾选的。打开VS2017的安装程序,在“工作负载”页面的右下角处勾选“使用C++的Linux开发”复选框,如图2-49所示。

图2-49

然后再继续安装VC2017。安装完毕后,新建工程的时候就可以看到有一个Linux工程选项了。下面我们通过一个例子来生成可执行程序。

例2.3 】 第一个VC++开发的Linux可执行程序。

(1)打开VC2017,单击菜单“文件”|“新建”|“项目”或者直接按快捷键Ctrl+Shift+N来打开新建项目对话框,在新建项目对话框上,左边展开“Visual C++”|“跨平台”,并选中“Linux”节点,此时右边出现项目类型,选中“控制台应用程序(Linux)”,并在对话框下方输入项目名称(比如test)和项目路径(比如e:\ex\),如图2-50所示。

图2-50

然后单击“确定”按钮,这样一个Linux项目就建好了。可以看到一个main.cpp已经建立好了,内容如下:

     #include <cstdio>
    
     int main()
     {
        printf("hello from test!\n");
        return 0;
     }

(2)打开虚拟机Ubuntu20.04,并使用桥接模式静态IP方式,虚拟机Ubuntu的IP地址为120.4.2.8,宿主机Windows 7的IP地址是120.4.2.200,保持相互ping通。

(3)设置连接。单击VC的菜单“工具”|“选项”来打开选项对话框,在该对话框的左下方展开“跨平台”,并选中“连接管理器”节点,在右边单击“添加”按钮,然后在出现的“连接到远程系统”对话框中,输入虚拟机Ubuntu20.04的IP地址、root密码等信息,如图2-51所示。

图2-51

单击“连接”按钮,此时将下载一些开发所需要的文件,如图2-52所示。

图2-52

稍等片刻,列表框内出现另一个主机名为120.4.2.8的SSH连接,如图2-53所示。

图2-53

这说明添加连接成功,单击“确定”按钮。

(4)编译运行,按F7键生成程序,如果没有错误,将在“输出”窗口中输出编译结果,如图2-54所示。

此时可以单击VC工具栏上的绿色三角形箭头图标,准备运行,如图2-55所示。

图2-54

此时将开始进行调试运行,稍等片刻运行完毕,现在我们可以单击菜单的“调试”|“Linux控制台”命令来打开“Linux控制台窗口”,并且可以看到运行结果了,如图2-56所示。

图2-55

图2-56

这就说明,我们的Linux程序运行成功了。因为是第一个VC2017开发的Linux应用程序,所以讲述得比较详细,后面将直接打开VC2017,新建一个Linux项目。

到目前为止,Linux开发环境已经建立起来了。由于在Windows下集成开发Linux C/C++最方便,因此笔者采用该方式的开发环境。 0NhkDSnjWAxeEal7OVhWy/NeBtqy52ABFAksJQtuFSGZ77HGKof14yJLyI2AMnNT

点击中间区域
呼出菜单
上一章
目录
下一章
×