在这个案例中包含一个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()
}
答案 0 :(得分:4)
在我的Linux系统上(Debian Jessie)ucontext.h
位于usr/include
,其中包含sys/ucontext.h
,gcc
会在usr/include/i386-linux-gnu/sys
中找到getcontext
。第一个定义函数setcontext
和ucontext_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不会了解函数setcontext
和ucontext.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更新。 接下来点击“浏览”按钮。
2。。C:\ Users [您的用户] \ AppData \ Local \ Microsoft \ Linux \ HeaderCache \ 1.0 [IdNumber] 将HeaderCache settings.xml.unused文件重命名为settings.xml
3。。在settings.xml文件中,将syncMethod更改为sftp_ssh。
4。。通过工具->选项->跨平台->连接管理器->远程头Intellisense Manager更新头缓存。 5。享受。