Ошибка при использовании AsmJit в приложении Qt GUI

ОС: Windows 10

IDE: Visual Studio 2015

Мне нужно использовать библиотеку AsmJit ( https://github.com/asmjit/asmjit) внутри моего приложения Qt GUI. Но это как-то несовместимо. Когда определенные заголовки включены из QT (QWidget и т. Д.), Вещи начинают ломаться.

Большинство ошибок происходят из этой строки:

ASMJIT_INLINE Error emit(uint32_t code, const Operand& o0, const Operand& o1, const Operand& o2, const Operand& o3) {
    return _emit(code, o0, o1, o2, o3);
  }

куда ASMJIT_INLINE определяется как __forceinline,

Когда я компилирую его в VS2015, он выдает следующую ошибку:

Severity    Code    Description Project File    Line    Suppression State
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2334   unexpected token(s) preceding '{'; skipping apparent function body  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  466 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C2238   unexpected token(s) preceding ';'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C2062   type 'int' unexpected   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  477 
Error   C2146   syntax error: missing '>' before identifier 'uint64_t'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  248 
Error   C2146   syntax error: missing '>' before identifier 'uint32_t'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  242 
Error   C2146   syntax error: missing '>' before identifier 'uint32_t'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  260 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  466 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C2143   syntax error: missing ';' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C2143   syntax error: missing ',' before '&'    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  494 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  464 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  466 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  477 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  479 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C2146   syntax error: missing ')' before identifier 'code'  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C2061   syntax error: identifier 'uint64_t' Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  284 
Error   C2061   syntax error: identifier 'uint32_t' Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  278 
Error   C2061   syntax error: identifier 'uint32_t' Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  296 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  464 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  466 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  479 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C2059   syntax error: ')'   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  494 
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  242 
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  248 
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  260 
Error   C3646   'o0': unknown override specifier    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  479 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  464 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  466 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  477 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  479 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C3646   'code': unknown override specifier  Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  466 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  477 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  479 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C2086   'asmjit::Error asmjit::Assembler::uint32_t': redefinition   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  468 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  470 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  481 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  483 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  485 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  487 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  489 
Error   C2086   'asmjit::Error asmjit::Assembler::Operand': redefinition    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  491 
Error   C2327   'asmjit::Assembler::uint32_t': is not a type name, static, or enumerator    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  494 
Error   C2327   'asmjit::Assembler::uint32_t': is not a type name, static, or enumerator    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  513 
Error   C2433   'asmjit::Assembler::uint32_t': '__forceinline' not permitted on data declarations   Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 
Error   C2433   'asmjit::Assembler::Operand': '__forceinline' not permitted on data declarations    Loader  C:\Users\Ik\Documents\Visual Studio 2015\Projects\DC\loader\CustomBone\contrib\AsmJit\base\assembler.h  472 

1 ответ

Решение

Подумав об этом, я думаю, что единственная причина, по которой asmjit не компилируется с Qt, состоит в том, что qt определяет emit макрос, который сталкивается с Asmjit emit функция. Итак, после расширения макроса код:

ASMJIT_INLINE Error emit(uint32_t code,
  const Operand& o0,
  const Operand& o1,
  const Operand& o2,
  const Operand& o3) { return _emit(code, o0, o1, o2, o3); }

становится:

ASMJIT_INLINE Error (uint32_t code,
  const Operand& o0,
  const Operand& o1,
  const Operand& o2,
  const Operand& o3) { return _emit(code, o0, o1, o2, o3); }

Использование Qt со сторонними сигналами и слотами ( https://doc.qt.io/qt-5/signalsandslots.html) упоминает это:

no_keywords говорит Qt не определять ключевые слова moc сигналы, слоты и излучение, потому что эти имена будут использоваться сторонней библиотекой, например, Boost. Затем, чтобы продолжить использовать сигналы и слоты Qt с флагом no_keywords, просто замените все варианты использования ключевых слов Qt moc в ваших источниках соответствующими макросами Qt Q_SIGNALS (или Q_SIGNAL), Q_SLOTS (или Q_SLOT) и Q_EMIT.

Добавление no_keywords Проект Qt - это то же самое, что и прохождение -DQT_NO_KEYWORDS компилятору (в основном определяющий QT_NO_KEYWORDS до 1).

Это можно исправить и на стороне asmjit, однако asmjit не делает ничего плохого. У вас будет такая же проблема со многими другими библиотеками, такими как boost.

Другие вопросы по тегам