【问题标题】:Linux header file not recognized in Visual Studio 2017 Linux Project在 Visual Studio 2017 Linux 项目中无法识别 Linux 头文件
【发布时间】:2017-08-18 17:58:47
【问题描述】:

当在我的 C 程序的 Visual Studio 2017 上的 Linux C++ 项目中包含 Linux 头文件 ucontext.h 时,它无法识别头文件。即使我包含 sys/ucontext.h,它也无法识别我应该能够用于 ucontext_t 对象的函数,例如 getContext() and setContext()。我不应该能够在 Linux C++ 项目中使用这些函数吗?

我正在编写的代码:

#include <stddef.h>
#include <string.h>
#include <sys/ucontext.h> 
// If I use ucontext.h instead, it gives the error: cannot open source file ucontext.h

//TCB structure
typedef struct TCB_t {
    struct TCB_t     *next;
    struct TCB_t     *prev;
    ucontext_t      context;
} TCB_t;


void init_TCB(TCB_t *tcb, void *function, void *stackP, int stack_size)
{
    memset(tcb, '\0', sizeof(TCB_t));   
    tcb->context.uc_stack.ss_sp = stackP;
    tcb->context.uc_stack.ss_size = (size_t)stack_size;

    int c = getcontext(tcb->context); // Cannot resolve field getcontext()
}

【问题讨论】:

  • 虽然您可能正在使用 C++ 编程或使用 C++ 编译器(看起来不像,为什么还有 c 标签?)但函数和结构仍然是 C 函数和结构。 C 中没有成员函数,只有全局范围内的独立非成员函数。我还建议您再次阅读链接参考,并注意函数对 arguments 的作用。
  • 啊,是的,我的最后一行错了,我改了。因此,首先,我使用了 c 标签,因为这是我作为 VS17 Linux C++ 项目编写的 C 程序,据我所知,经过一些研究,它将编译为 C 程序。现在,关于我的实际问题,由于 C 中没有成员函数,这是否意味着 Linux C++ 项目不能在 Linux 中包含 C 库?还是我理解错了?
  • getcontext 将指向 ucontext_t 的指针作为参数,而不是 ucontext_t 作为参数。此外,由于它初始化了结构,您可能应该在调用它之后更改uc_stack

标签: c linux visual-studio visual-studio-2017


【解决方案1】:

在此答案上,您需要 Visual Studio Community 2017 15.9.7+ - 在 Visual Studio Enterprise 上测试此解决方案 2019预览4。

Visual Studio 需要下载本地计算机中的所有远程标头,以确保智能感知的正确行为。

新方法“rsync_ssh”不会下载所有标头。您可以通过 sftp_ssh 使用旧方法 .zip。

0. 添加远程连接。
工具->选项->跨平台->连接管理器

1. 选择您的连接 从 Tools->Options->Cross Platform->Connection Manager->Remote Headers Intellisense Manager 更新。 接下来点击探索按钮。

2. C:\Users[YourUser]\AppData\Local\Microsoft\Linux\HeaderCache\1.0[IdNumber] 将 HeaderCache settings.xml.unused 文件重命名为 settings.xml

3.在settings.xml文件中将syncMethod改为sftp_ssh。

4. 从 Tools->Options->Cross Platform->Connection Manager->Remote Headers Intellisense Manager 更新标头缓存。 5. 享受吧。

之前

之后

【讨论】:

    【解决方案2】:

    在我的 Linux 系统 (Debian Jessie) 上,ucontext.h 位于 usr/include 中,而 sys/ucontext.h 又包含 gcc 中的 usr/include/i386-linux-gnu/sys。第一个定义函数getcontextsetcontext。第二个定义了数据结构ucontext_t等。

    在 Windows 主机上,VCLinux 已在 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include\x86_64-linux-gnu\sys 中安装了第二个 ucontext.h(定义数据结构)的副本。但是第一个ucontext.h 不存在。

    VCLinux/Visual Studio 将在 Linux 远程编译和运行这个程序:

    #include <ucontext.h>
    #include <iostream>
    int main()
    {
       ucontext ucxt;
       ::getcontext (&ucxt);
       std::cout << ucxt.uc_flags << std::endl;
       return 0;
    }
    

    但 IntelliSense 不知道函数 getcontextsetcontext 或相关的数据结构。因此,您会在名称下方看到红色的小波浪线,并且没有完成帮助。

    您可以复制第一个ucontext.h 并将其放入Windows 主机上的C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include。然后一切都会正常工作。您可以针对VCLinux GitHub site 上缺少的标头提出问题。

    注意:Windows 路径适用于 Visual Studio 2015。它们在 2017 年将有所不同。

    适用于 VCLinux 1.0.6。

    ==============

    2018 年 4 月 10 日更新

    Microsoft 已解决 Linux 系统之间的标准包含文件位置差异的问题。如this Visual C++ blog post 中所述,特定于GCC 设置的标头是从Linux 远程复制的,并基于每个连接存储在Windows 主机上。

    【讨论】:

    • 是的。它编译。它只是智能感知。为 VS 2017 添加缺少的标头的文件夹是:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Linux\include\usr\include
    猜你喜欢
    • 2017-06-04
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2013-11-18
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多