繁体   English   中英

用于 GTK 开发的 VS Code C/C++ 配置

[英]VS Code C/C++ configuration for GTK development

我正在尝试在 Linux Ubuntu 上为 VS Code 中的 C/C++ 编程设置一个友好的环境。多年来,我一直在使用 Visual Studio 和 Code Blocks,但是 VS Code 设置非常不清楚,以至于我几乎无法理解文档主题. 目前我正在尝试编译一些“hello world”程序,所以应该不难。

可以说我正在尝试构建和运行 GTK-3 hello world 程序 执行此操作的命令行说明是:

gcc hello_world.c `pkg-config --cflags --libs gtk+-3.0`

从 bash 使用时它工作得很好。所以首先我创建了一个名为GTK-devel的配置c_cpp_properties.json它应该编译它。 json文件内容为:

{
    "configurations": [
        {
            "name": "GTK-devel",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-gcc-x64",
            "compilerArgs": [
                "`pkg-config --cflags --libs gtk+-3.0`"
            ]
        }
    ],
    "version": 4
}

第一个问题来了:VS Code 中的配置是什么? 在 Visual Studio 或 Code::Blocks 中,类似的事情在直觉上是清晰且不可理解的——只需设置您需要的一切,然后在编译前在某处(菜单、对话框等)选择它。 我想在 VS Code 中它是不同的东西, 文档根本没有解释 - 它只是说可以创建一个配置,但没有提到如何使用它。 此外,没有任何地方可以 select 它(终端,任务等),甚至在菜单等任何地方都看不到它。

第二个问题涉及任务。 因此,如果配置方法失败,我决定设置一个可以从主菜单清楚地访问的任务。 tasks.json文件包含以下内容:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc compilation",
            "command": "/usr/bin/gcc `pkg-config --cflags --libs gtk+-3.0`",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "kompilator: /usr/bin/gcc GTK3"
        }
    ]
}

当我从菜单Terminal -> Run build task -> C/C++: gcc compilation中选择时,就调用指令而言,一切似乎都很好,但缺少库错误(系统中包含并存在):

"/usr/bin/gcc `pkg-config --cflags --libs gtk+-3.0`" -g /home/user/Programming/hello_world/hello_world.c -o /home/user/Programming/hello_world/hello_world
/bin/sh: 1: /usr/bin/gcc -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: not found

这里出现了第三个问题:同样, 文档并没有真正解释什么是终端。 它说它默认为$SHELL ,但如果是这样,为什么库对编译器不可见?

所以最后的问题是:VS Code 是真实的 IDE 还是它只是一种营销手段,它可以在一个地方用来做很多不同的事情,但实际上最好为每种语言使用专用工具等。设置问题会成功地分散您的注意力吗?

花了四个小时后,我终于找到了解决方案。 它很简单,一半脏。 我们这里go:

这段代码:

`pkg-config --cflags --libs gtk+-3.0`

产生这样的东西(那是我的环境,例如):

-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

VScode 不支持 `. 之间的 arguments。 所以我们所要做的就是复制并粘贴task.json中的每个参数:

"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"
        ],

差点忘了。 对于智能感知文件c_cpp_properties.json只需在includePath添加两个模式:

"includePath": [
            "${workspaceFolder}/**",
            "/usr/include/**",
            "/usr/lib/x86_64-linux-gnu/**"
        ]

就是这样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM