操作系统实验要求实现进程之间的通信,共享内存等要涉及到使用窗口程序的输入框的方法,可以使用Win32 API或者是POSIX API,由于Win32 API各种调用函数需要参入的参数特别多(查阅说是Win API很多参数是以前远古时代留下来的,有些可能没用了有些可能还有用,所以为了兼容,变的形式很丑),所以决定用POSIX标准来实现,这意味着需要在linux环境下进行开发,因此得在虚拟机里装的ubuntu配置c++的开发环境
至于开发环境本来想用devc++的但是好像ubuntu版本无法调试(该软件太老了),所以选择vscode
需要使用窗口程序,意味着要用c++实现GUI(图形界面),但属于新手一枚不知道哪个库好用,开始想用QT,查了之后大部分教程都是用的QT软件拖放控件来生成代码的,之后查看纯用代码使用QT,看起来非常的复杂,短期内没法快速上手,转战GTK+(Ubuntu的GUI好像也用的是GTK),目前看来实现相同功能使用GTK+的代码比QT少,可能容易上手一些。
另外,为了在虚拟机里打字方便,按照搜狗输入法官网linux版本的教程,配置花了1.5h,期间还改了更新源为alibaba提供的镜像,完成教程重启后结果无效。。。
废话不说,进入正文(对了写这篇的初心是防止虚拟机崩了时候能快速复现)
对于配置环境,首先肯定先看看vscode官网的教程:
Using C++ on Linux in VS Code
看了一大堆教程,感觉最简洁明了的教程是该博主的(虽然和官网教程有重叠):https://blog.csdn.net/weixin_45608532/article/details/122175582?utm_source=app&app_version=5.3.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
sudo snap install --classic code
安装后,根据个人习惯改了一下字体大小和风格。font-size改为16,风格为米色
这也是官网里要求的前期准备
sudo apt-get update
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install gdb
gdb好像是用于debug的?我看在后面配置debug文件时候提到了gdb的名字
安装C/C++及C/C++ extension与Code Runner
之后在相应的cpp文件点击右上角的三角运行符号或者直接在终端命令行编译执行即可。
另外,vscode会在当前的文件夹(相当于workspace,会悄悄咪咪地创建.vscode文件夹,这个文件夹里专门放三个json配置文件
这三个配置文件在下面会涉及到,这里先提一嘴(需要点一些按钮进行创建,具体点什么详情见上面提的官网文档,注意,点这些按钮的时候要先点击当前的cpp文件,把页面打开在这个cpp文件)
主要参考:Ubuntu下GTK+的下载、安装
另外加个这个https://blog.csdn.net/qq_40904479/article/details/123707920
一行代码解决安装
sudo apt install libgtk-3-dev
1.下面就是跟着上面博客一步步进行了模仿,最后在vscode终端执行如下是可以编译运行文件的,这里从-phread开始的一长段是通过
pkg-config --cflags --libs gtk+-3.0
获得的
g++ gtk_test.c -o test5 -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
没学过cmake的用法所以没有跟着这个博主那样把这个长段指令放在一个专门编译用的文件里
2.于是想在vscode的配置文件里设置头文件的信息,头文件是来指出库文件所在的位置,编译的时候进行链接
vscode添加c++第三方库头文件的方法
把上面的长段指令放在properties文件里后,编译的时候报找不到
3.找到了这个
VS Code 玩 C GTK 不报错能顺利编译运行的设置 tasks.json 等
这个倒是给了我一丝希望,配置三个文件后,操作后还是没啥用。
于是死心,虽然麻烦,就用终端加上编译指令的方法,后来看到编译指令可以不用加那么长段的指令,可以这样简单的写
g++ -o testGtk testGtk.c `pkg-config --cflags --libs gtk+-3.0`
但还是报错
4.似乎原因在于那个符号不是字符串符号,以及还有顺序问题?(没测试)
最后最后,还是觉得vscode的配置没配对
找到了一个看似可行的解决方法,似乎总结了前面绕的大圈(目前还没试)
https://www.it1352.com/2473193.html
附录:
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-pthread",
"-I/usr/include/gtk-3.0",
"-I/usr/include/at-spi2-atk/2.0",
"-I/usr/include/at-spi-2.0",
"-I/usr/include/dbus-1.0",
"-I/usr/lib/x86_64-linux-gnu/dbus-1.0/include",
"-I/usr/include/gtk-3.0",
"-I/usr/include/gio-unix-2.0",
"-I/usr/include/cairo",
"-I/usr/include/pango-1.0",
"-I/usr/include/fribidi",
"-I/usr/include/harfbuzz",
"-I/usr/include/atk-1.0",
"-I/usr/include/cairo",
"-I/usr/include/pixman-1",
"-I/usr/include/uuid",
"-I/usr/include/freetype2",
"-I/usr/include/libpng16",
"-I/usr/include/gdk-pixbuf-2.0",
"-I/usr/include/libmount",
"-I/usr/include/blkid",
"-I/usr/include/glib-2.0",
"-I/usr/lib/x86_64-linux-gnu/glib-2.0/include",
"-lgtk-3",
"-lgdk-3",
"-lpangocairo-1.0",
"-lpango-1.0",
"-lharfbuzz",
"-latk-1.0",
"-lcairo-gobject",
"-lcairo",
"-lgdk_pixbuf-2.0",
"-lgio-2.0",
"-lgobject-2.0",
"-lglib-2.0"
],
"includePath": [
"${workspaceFolder}/**",
"/usr/include/**",
"/usr/lib/x86_64-linux-gnu/**"
]
2022/5/4 新增
今天尝试了一下命令
g++ gtk_test.cpp -o test2 `pkg-config --cflags --libs gtk+-3.0`
g++ -o test1 gtk_test.cpp `pkg-config --cflags --libs gtk+-3.0`