Visual Studio 2017 Linux项目中无法识别Linux头文件

时间:2017-03-25 22:06:43

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

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

代码I'写作:

#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()
}

2 个答案:

答案 0 :(得分:4)

在我的Linux系统上(Debian Jessie)ucontext.h位于usr/include,其中包含sys/ucontext.hgcc会在usr/include/i386-linux-gnu/sys中找到getcontext。第一个定义函数setcontextucontext_t。第二个定义了数据结构ucontext.h等。

在Windows主机上,VCLinux已在C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include\x86_64-linux-gnu\sys中安装了第二个ucontext.h(定义数据结构)的副本。但第一个#include <ucontext.h> #include <iostream> int main() { ucontext ucxt; ::getcontext (&ucxt); std::cout << ucxt.uc_flags << std::endl; return 0; } 不存在。

VCLinux / Visual Studio将在Linux远程编译并运行该程序:

getcontext

但IntelliSense不会了解函数setcontextucontext.h或相关的数据结构。所以你会在名字下面得到一点红色的曲线,没有完成帮助。

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

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

适用于VCLinux 1.0.6。

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

18年4月10日更新

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

答案 1 :(得分:2)

  

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

Visual Studio需要在本地计算机上下载所有远程标头,以确保智能感知。

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

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

1。。选择您的连接 从工具->选项->跨平台->连接管理器->远程头Intellisense Manager更新。 接下来点击“浏览”按钮。

image

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

image

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

image

4。。通过工具->选项->跨平台->连接管理器->远程头Intellisense Manager更新头缓存。 5。享受。

之前

image

image

之后

image

image