Файл заголовка Linux не распознается в проекте Linux Visual Studio 2017

При включении файла заголовка Linux, в данном случае ucontext.h, в проект Linux C++ в Visual Studio 2017 для моей программы C, он не распознает файл заголовка. Даже когда я включаю 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()
}

person Griffin    schedule 25.03.2017    source источник
comment
Хотя вы можете программировать на C++ или использовать компилятор C++ (не похоже на это, и почему тогда тег c?), функции и структуры по-прежнему являются функциями и структурами C. В C нет функций-членов, только автономные функции, не являющиеся членами, в глобальной области видимости. Я также предлагаю вам снова прочитать связанную ссылку и отметить, что функции принимают в качестве аргументов.   -  person Some programmer dude    schedule 26.03.2017
comment
Ах да, моя последняя строка была неправильной, и я изменил ее. Итак, во-первых, я использовал тег c, потому что это программа на C, которую я пишу как проект VS17 Linux C++, поскольку я понимаю, что после некоторых исследований она будет скомпилирована как программа на C. Теперь, что касается самого вопроса, который у меня возник, поскольку в C нет функций-членов, означает ли это, что проект Linux C++ не может включать библиотеки C в Linux? Или я неправильно это понимаю?   -  person Griffin    schedule 26.03.2017
comment
getcontext принимает указатель на ucontext_t в качестве аргумента, а не ucontext_t в качестве аргумента. Кроме того, поскольку он инициализирует структуру, вам, вероятно, следует изменить uc_stack после его вызова.   -  person Ross Ridge    schedule 26.03.2017


Ответы (2)


В моей системе Linux (Debian Jessie) 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 нет.

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.

Примечание. Пути Windows указаны для Visual Studio 2015. В версии 2017 они будут другими.

Применяется к VCLinux 1.0.6.

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

Обновление от 10 апреля 2018 г.

Microsoft решила проблему различий в расположении стандартных включаемых файлов между системами Linux. Как описано в этом блоге Visual C++ post, заголовки, характерные для настройки GCC, копируются с удаленного компьютера Linux и сохраняются на хосте Windows для каждого подключения.

person stanthomas    schedule 26.03.2017
comment
Да. Он компилируется. Это всего лишь IntelliSense. Папка для добавления отсутствующих заголовков для VS 2017: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Linux\include\usr\include - person Anton Andreev; 20.04.2017

В этом ответе для выполнения следующих действий вам потребуется Visual Studio Community 2017 15.9.7+ — протестировано это решение в Visual Studio Enterprise 2019 Preview 4.

Visual Studio необходимо загрузить все удаленные заголовки на вашем локальном компьютере для правильного поведения intellisense.

Новый метод rsync_ssh не загружает все заголовки. Вы можете использовать старый метод .zip через sftp_ssh.

0. Добавить удаленное подключение.
Инструменты->Параметры->Кроссплатформенность->Диспетчер подключений

1. Выберите Обновление подключения в меню Сервис->Параметры->Кроссплатформенность->Диспетчер подключений->Диспетчер удаленных заголовков Intellisense. Затем нажмите кнопку «Исследовать».

image

2. C:\Users[YourUser]\AppData\Local\Microsoft\Linux\HeaderCache\1.0[IdNumber] Переименуйте файл HeaderCache settings.xml.unused в settings.xml.

image

3. В файле settings.xml измените syncMethod на sftp_ssh.

image

4. Обновите кеш заголовков, выбрав Инструменты->Параметры->Кроссплатформенность->Диспетчер подключений->Диспетчер удаленных заголовков Intellisense. 5. Наслаждайтесь.

До

image

image

После

image

image

person Joma    schedule 08.03.2019