在这种情况下,在Visual Studio 2017上针对我的C程序的Linux C 项目中包含Linux头文件ucontext.h时,它无法识别该头文件。即使当我包含sys / ucontext.h时,它也无法识别我应该能够用于ucontext_t对象的函数,例如getContext()和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() }
在我的Linux系统(Debian Jessie)ucontext.h上,usr/include其中包含的sys/ucontext.h内容gcc将在中找到usr/include/i386-linux- gnu/sys。第一个定义功能getcontext和setcontext。第二个定义数据结构ucontext_t等。
ucontext.h
usr/include
sys/ucontext.h
gcc
usr/include/i386-linux- gnu/sys
getcontext
setcontext
ucontext_t
在Windows主机上,VCLinux在中安装了第二个副本ucontext.h(定义了数据结构)C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include\x86_64-linux- gnu\sys。但是第一个ucontext.h不存在。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include\x86_64-linux- gnu\sys
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不会知道功能getcontext和/ setcontext或关联的数据结构。因此,您将在名称下看到很少的红色弯曲,并且没有完成帮助。
您可以复制第一个副本ucontext.h并将其C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include放在Windows主机上。这样,一切都会正常进行。您可能会在VCLinux GitHub站点上引发缺少标题的问题。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include
注意:Windows路径适用于Visual Studio2015。2017年将有所不同。
适用于VCLinux 1.0.6。
==============
更新18年4月10日
Microsoft已解决Linux系统之间标准包含文件位置差异的问题。如该Visual C ++博客文章中所述,特定于GCC安装程序的标头是从Linux远程复制并按每个连接存储在Windows主机上的。
GCC