【问题标题】:gtk.h missing in Visual Studio for Linux DevelopmentVisual Studio for Linux Development 中缺少 gtk.h
【发布时间】:2019-02-22 23:13:30
【问题描述】:

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

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

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

在编译尝试时,当然有将近 4k 的错误。好吧,说得够多了,通过一点提示from this old tutorial 和一些反复试验,我设法在调试/项目属性/配置属性/VC++ 目录/头文件目录下添加了这组链接:

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

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 <gtk-3.0/gtk/gtk.h>

现在它不见了&lt;gdk/gdk.h&gt;!在主机 Windows 设备上进行此更改时 - 结果相同,但在 VS 中。

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

编辑2

执行时:

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

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

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

2) 如何/在何处将上述行添加到 Visual Studio,使其远程执行,并在目标上正确添加所有 GTK 依赖项

研究股票目前的wiringPi库(因为这是用于交叉编译Linux开发的Blink led示例)我发现,在Project Properties/Linker/Input/Library Dependencies中有一个神秘的条目:

wiringPi

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

【问题讨论】:

  • 请决定是否要在目标上进行交叉编译或开发。你不能两者都做。
  • @liberforce 正如我在您的答案下方评论的那样,我在 RPi 上进行了编译只是为了确定它的构建配置实际上是无效的。 I have found here in comment of user Stefan and following 他们过去处理过类似的问题,但描述对我来说太神秘了
  • 好的,我现在对情况有了更好的理解。该 Linux 开发插件只是复制和构建在目标上,进行远程构建,而不是使用 VC 编译器进行交叉构建。这使整个事情变得过于复杂,pkg-config 只是为了解决该问题并为您获取依赖项。
  • 该注释暗示您应该能够在编译器和链接器选项中使用 pkg-config,并且不必手动设置包含目录。
  • 这个答案 stackoverflow.com/questions/45570103/g-cant-link-curl-lib-files/… 解释了如何将 pkg-config 与 VSLinux 一起使用。 VS 不会为你添加第三方库到 Linux 目标,你必须单独设置它们,见stackoverflow.com/questions/43552526/…

标签: c linux visual-studio gtk raspberry-pi3


【解决方案1】:

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 &lt;gtk/gtk.h&gt;

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

编辑:

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

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

编辑 2:

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

这是 OP 的工作配置:

【讨论】:

  • 我的代码中的所有这三行与您的示例完全相同,但是编译器(在主机或目标上)仍然找不到 gtk.h,尽管它就在那个位置。我还在我的 RPi 目标 (here's result) 上运行了您建议的 pkg-config 命令,并且列出的依赖项比我添加到 VC++ 附加目录中的要多;其中一些被列出两次,其中一些没有被 VS 复制到我的 Windows 主机 - 我应该手动复制它们并添加到列表中吗?依赖列表的顺序重要吗?我对 Linux 和 pkg-config 真的一无所知。
  • 唯一看起来有点奇怪的是包含目录的屏幕截图中的条目通常应该用引号括起来“c:\Program Files\ ....”
  • 顺便说一句,您应该始终使用#include &lt;gtk/gtk.h&gt;。这是为了更容易迁移到 GTK+ 的另一个主要版本(gtk+-3.0 目录将变为 gtk+-4.0)。每个 GTK+ 程序都这样做。无需更改所有现有代码来修复所有包含,您只需更改构建配置中的包含目录。所以不要改变那个包括,这是没有意义的。改为修复您的构建配置。
  • 它可以编译,但我不确定它是不是最好的选择。您应该将带有--cflagspkgconfig 调用传递给编译器,并将--libs 传递给链接器。 命令行在那种情况下可能真的意味着任何东西,我不确定它以后会不会咬你。
【解决方案2】:

有了这个设置,你应该

#include <gtk\gtk.h>

而不是

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

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

【讨论】:

  • 是的,我怕最后一句话可能不清楚。我已经尝试了所有这些:#include , , 在头目录配置中具有不同的链接。此外,单独的 include/ 显然不够好,因为它在我添加其余目录之前就已经存在,并且出现了大量错误。
  • 我假设由于标题中的“硬链接”排序,这些目录是必需的,例如,如果标题中有 #include 行,则必须搜索此文件关于它的依赖关系,否则找不到它,至少在我的情况下。
  • 请在包含中使用斜杠而不是反斜杠:stackoverflow.com/a/5790259/518853
  • @liberforce 好的,据我了解,由于兼容性问题,正斜杠更好,但更改为它们似乎没有什么区别。
  • @zaguoba:是的,我的评论是为了不。只是这是不好的做法,所以不应该做广告,但与你的问题无关。
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多