gtk.h 在 Visual Studio 中缺失 Linux 开发

gtk.h missing in Visual Studio for Linux Development

我目前正在尝试借助 Visual Studio 2017 社区中的 Linux 开发插件,在 Rasbpian 下为 Raspberry Pi 3B 编写应用程序。根据教程,我设法成功部署了 'Blink' 示例,由 Microsoft 人员高贵地附上,并且进展顺利。感谢 wiringPi 库,我什至通过 SPI 进行了一些传输。然后我想在我的应用程序中添加一些 GUI,这样就可以在点击屏幕上的按钮时进行一些传输。

IntelliSense 提示我,事实上,工具集中存在 gtk-3.0 库。似乎在每次连接时都从目标设备复制库,我在我的 Raspberry 上安装了 gtk。所以我在这个 Blink 示例中添加了一个简单的行:

#include <gtk-3.0/gtk/gtk.h>

在编译尝试中,当然有将近4k的错误。好吧,说得够多了,有一点提示 from this old tutorial 和一些反复试验,我设法在 Debugging/Project properties/Configuration properties/VC++ directories/Header 文件目录:

一切都朝着有希望的方向发展,错误数量从 4k 减少到只有一个:

gtk-3.0\gtk\gtk.h: No such file or directory

不管这个文件实际上在这个位置:

无论上面配置中的链接组合和使用语句组合,编译器(?)都找不到这个该死的文件。

请停止

编辑

我刚刚确认,确实是目标配置的问题。这是好是坏,取决于观点。很好,因为 VS 设置可能一切都很好。不好,因为我对 Linux.

下的编译一无所知

目标(Raspberry Pi 3B)编译的所有成分都由 Linux 开发插件复制。所以在终端我执行了行:

g++ main.cpp -o Blink2onRPi

得到了

main.cpp:4:21: fatal error: gtk/gtk.h: no such file or directory

现在,我将目标 RPi 上 main.cpp 中的 include 行更改为:

#include <gtk-3.0/gtk/gtk.h>

现在它不见了 <gdk/gdk.h>!在主机 windows 设备上进行此更改时 - 结果相同,但在 VS.

当我在 VS 中处理类似的问题时,在为 IntelliSense 设置链接时(现在显然它们是为了这个目的),现在可能必须在 Raspbian 的某处设置类似的依赖关系。但是在哪里呢?

编辑2

执行时:

g++ main.cpp -o Blink2onRPi `pkg-config --cflags --libs gtk+-3.0`

在目标 RPi 上没有更多 GTK-related 错误,只有 wiringPi(也存在于项目中)未定义的引用。它提出了两个可能的问题:

1) 如何在 RPi 上设置 wiringPi 以便项目可以在目标上手动编译并且

2) How/where 将上面的行添加到 Visual Studio,以便远程执行并在目标

上正确添加所有 GTK 依赖项

正在研究现有的 wiringPi 库(因为这是 cross-compile Linux 开发的 Blink led 示例)我发现,在项目 Properties/Linker/Input/Library 依赖项中有一个神秘的条目:

wiringPi

仅此而已,仅此而已。删除此条目后,编译会在目标上弹出与之前相同的错误(显然缺少正确的 wiringPi 设置)——未定义的引用(未提及任何缺失 headers)。这与案件有关吗?如果是这样,我怎么能在那里添加这样的条目来处理缺少的 GTK 依赖项?

使用该设置,您应该

#include <gtk\gtk.h>

而不是

#include <gtk-3.0\gtk\gtk.h>

或者删除所有那些 VC++ directories/Header 文件目录,只保留其中一个以 include/ 结尾的目录,而不是列出所有子目录。

TL;DR

使用下面的屏幕截图了解在 VS 配置中添加 pkg-config 调用的位置,以便它将其转发到目标上的编译器和链接器。 感谢@zaguoba 提供这些

原始答案:

要包含的目录列表由 pkg-config 提供。例如 pkg-config --cflags-only-I gtk+-3.0 将为您提供所需的包含目录列表。这些是您需要添加到 VC++ 将查看包含文件的目录中的那些。如果将在 #include 中使用的相对路径添加到这些路径之一,则可以找到该文件。

示例:

如果添加到目录 C:\Program Files\foo\bar\gtk+-3.0

并且在你的 C 文件中: #include <gtk/gtk.h>

然后编译器会寻找C:\Program Files\foo\bar\gtk+-3.0\gtk\gtk.h.

编辑:

这一切都意味着 'file not found' 错误是因为您实际上是在目标上构建,而目标不知道 C:\Program Files\... 是什么意思。这些应该是目标文件系统上的路径,编译器被调用的地方。而这正是 pkg-config 提供的。

Windows 机器文件系统上的这些文件的副本仅供 Intellisense 使用,不供编译器使用。

编辑 2:

那就是 Visual Studio 2017 社区 Linux 开发插件是需要理解的。它不是用于从 Windows 到 Linux 的交叉编译,而是它只是将代码同步到 Windows 主机(用于 Intellisense),但 构建在目标 .这意味着所有路径和命令都是 Linux 路径和命令,运行 在目标上。

这是 OP 工作配置: