Я пытаюсь создать простое тестовое приложение C ++, основанное на функциональном тесте KMS configure qt 5.1 (qtbase / config.tests / qpa / kms), который не выполняется. Приложение очень просто, как показано ниже:
#include <stdlib.h>
extern "C" {
#include <gbm.h>
#include <xf86drmMode.h>
#include "xf86drm.h"}
#include <EGL/egl.h>
#include <GLES2/gl2.h>
int main(int, char **)
{
// Check for gbm_surface which is quite a recent addition.
gbm_surface *surface = 0;
return 0;
}
Проблема в том, что при включении «libdrm / xf86drmMode.h» или «libdrm / xf86drm.h» также включается «drm / drm.h». Внутри «drm.h» есть структура, определяемая как:
struct drm_buf_map {
int count; /**< Length of the buffer list */
void *virtual; /**< Mmap'd area in user-virtual */
struct drm_buf_pub *list; /**< Buffer information */
};
Обратите внимание на переменную с именем «virtual» в структуре drm_buf_map. Это вызывает ошибку компилятора C ++, которая не может быть решена с помощью extern «C». Это имеет смысл, но я не уверен, как решить эту проблему (кроме использования компилятора Си). Есть флаг компилятора, чтобы справиться с этим?
Спасибо!
Реальная проблема здесь в том, что вы включаете неправильный drm.h
, Вы не используете менеджер пакетов и тоже не указываете /usr/include/libdrm
в пути включения. Если одно из этих двух не выполнено, компилятор подберет /usr/include/drm.h
или другой, который имеет эту проблему. Но файл из libdrm (/usr/include/libdrm/drm.h
) это исправлено.
Ссылаться на реальный drm.h
файл — у которого уже есть патч Эрика за эти 4 года назад:
struct drm_buf_map {
int count; /**< Length of the buffer list */
#ifdef __cplusplus
void *virt;
#else
void *virtual; /**< Mmap'd area in user-virtual */
#endif
struct drm_buf_pub *list; /**< Buffer information */
};
Вот возможное решение:
добавлять #define virtual blah_blah_blah
перед include
добавлять #undef virtual
после include
редактировать
Теперь, если вам нужно использовать член virtual
тебе придется позвонить blah_blah_blah
,