230628-expected unqualified-id

eton@230628 在编译supra基于debian12 Qt5.15 tbb12 libtbb12/stable,now 2021.8.0-2 amd64 的时候遇到下面的问题。 一直找不到实际的问题原因,指导发现下面几个github的链接,原来是符号冲突导致的。

1. resolve solution

1. 添加QT_NO_KEYWORDS到编译选项中;

TARGET_COMPILE_DEFINITIONS(SUPRA_GUI
PRIVATE ${SUPRA_Lib_DEFINES}
${CAMPVIS_DEFINITIONS} NODE_EDITOR_STATIC QT_NO_KEYWORDS)

ref:

2. 将qt中的关键字替换为宏定义

signal: 替换为Q_SIGNALS

slots: 替换为Q_SLOTS

emit 替换为Q_EMIT

因为上面的内容

It tells Qt not to define the moc keywords signals, slots, and emit, because these names will be used by a 3rd party library, e.g. Boost. Then to continue using Qt signals and slots with the no_keywords flag, simply replace all uses of the Qt moc keywords in your sources with the corresponding Qt macros Q_SIGNALS (or Q_SIGNAL), Q_SLOTS (or Q_SLOT), and Q_EMIT.

ref:

3. 重新编译,因为supra中涉及到使用第三方库NodeEdit,这个也使用了Qt所以也需要做setp02的替换。

for i in `find  ./ -name "*.hpp"` ; do
sed s/signals:/Q_SIGNALS:/g -i $i && \
sed s/slots:/Q_SLOTS:/g -i $i && \
sed s/emit:/Q_EMIT:/g -i $i;
done

2. process step

1. g++ -E /usr/include/oneapi/tbb/flow_graph.h > a.h 查看实际生成的文件到底是否存在语法问题;

合并头文件得到的问题代码截取部分如下,其实可以看到是没有语法问题的。

namespace d1 {
# 190 "/usr/include/oneapi/tbb/profiling.h"
inline void create_itt_sync(void* , const char* , const char* ) {} inline void call_itt_notify(notify_type , void* ) {} inline void call_itt_task_notify(notify_type , void* ) {}
# 226 "/usr/include/oneapi/tbb/profiling.h"
struct event {
event(const std::string &) { } void emit() { } static void emit(const std::string &) { }
};
}

但是这里学习到了namespace的注入功能

# 20 "/usr/include/oneapi/tbb/detail/_namespace_injection.h"
namespace tbb {} namespace oneapi {
namespace tbb = ::tbb;
}

目标是将::tbb等价于::oneapi::tbb 这样就可以兼容以前没有oneapi时候对tbb的命名空间的使用了.

ref:

2. 分析C++中到底'qualified'是什么意思

A qualified id-expression is an unqualified id-expression prepended by a scope resolution operator ::, and optionally, a sequence of any of the following separated by scope resolution operators

有人做如下翻译,这样理解相对容易

非受限id(Unqualified-id)

广义化的标识符(identifier)。它可以是前面的任何一种或者析构函数的名称(比如Date或者List<T, T, N>)

受限id(qualified-id)

用一个类名或者名字空间对一个unqualified-id进行限定,或者使用全局作用域解析运算符::进行限定

这种名称可以是多次限定的

例子:::X,S::x,Array::y,::N::A:

ref: https://en.cppreference.com/w/cpp/language/qualified_lookup

3. search below info in bing.

oneapi/tbb/profiling.h:229:15: error: expected unqualified-id before ‘)’ token

get the resolution finally.

error message:

/usr/include/oneapi/tbb/profiling.h:229:15: error: expected unqualified-id before ‘)’ token

229 | void emit() { }

| ^

/usr/include/oneapi/tbb/profiling.h:231:22: error: expected unqualified-id before ‘const’

231 | static void emit(const std::string &) { }

| ^~~~~

/usr/include/oneapi/tbb/profiling.h:231:22: error: expected ‘)’ before ‘const’

231 | static void emit(const std::string &) { }

| ^~~~

| )


3. 当前问题产生的实际分析

  1. Qt代码中signals, slots, emit其实都是宏定义的关键字, "qobjectdefs.h" 中对与signals, slots, emit的解析最后都是empty,也就是最后macro在解析的时候如果遇到emit这个字符串,那么如果前面存在Qt的头引用,那么就会出现

    # define emit

    这样后面emit关键字变为‘NULL’这样就不符合C++的语法了,因为函数定义需要一个NAME ;

  2. Recurrence issues

    创建如下文件:

$ cat abc.cc
void fun(){}
void emit(){}
void fun3(){}

利用g++ -c进行编译

$ g++ -Demit='' -c  abc.cc
abc.cc:2:11: error: expected unqualified-id before ‘)’ token
2 | void emit(){}
| ^
  1. 问题完整的复现,finish.

Appendix

full error log.

FAILED: src/GraphicInterface/CMakeFiles/SUPRA_GUI.dir/SUPRA_GUI_autogen/mocs_compilation.cpp.o
/usr/bin/g++ -DHAVE_BEAMFORMER -DHAVE_BEAMFORMER_MINIMUM_VARIANCE -DHAVE_CUDA -DHAVE_CUDA_CUBLAS -DHAVE_CUFFT -DHAVE_DEVICE_IGTL_OUTPUT -DHAVE_DEVICE_METAIMAGE_OUTPUT -DHAVE_DEVICE_TRACKING_IGTL -DHAVE_DEVICE_TRACKING_SIM -DHAVE_DEVICE_ULTRASOUND_SIM -DNODE_EDITOR_STATIC -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -I/home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface -I/home/eton/00-src/supra/src/GraphicInterface -I/home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/SUPRA_GUI_autogen/include -I/home/eton/00-src/supra/src/GraphicInterface/SUPRA_GUI -I/home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/NodeEditor_install/include -I/home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/NodeEditor/include -I/home/eton/00-src/supra/src/GraphicInterface/private -I/include -I/home/eton/00-src/supra/src/SupraLib -I/home/eton/00-src/supra/src/SupraLib/utilities/jsoncpp -I/usr/include/openigtlink -isystem /home/eton/Qt/5.15.2/gcc_64/include -isystem /home/eton/Qt/5.15.2/gcc_64/include/QtWidgets -isystem /home/eton/Qt/5.15.2/gcc_64/include/QtGui -isystem /home/eton/Qt/5.15.2/gcc_64/include/QtCore -isystem /home/eton/Qt/5.15.2/gcc_64/./mkspecs/linux-g++ -DQT_QML_DEBUG -fopenmp -g -fPIC -std=gnu++11 -MD -MT src/GraphicInterface/CMakeFiles/SUPRA_GUI.dir/SUPRA_GUI_autogen/mocs_compilation.cpp.o -MF src/GraphicInterface/CMakeFiles/SUPRA_GUI.dir/SUPRA_GUI_autogen/mocs_compilation.cpp.o.d -o src/GraphicInterface/CMakeFiles/SUPRA_GUI.dir/SUPRA_GUI_autogen/mocs_compilation.cpp.o -c /home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/SUPRA_GUI_autogen/mocs_compilation.cpp
In file included from /usr/include/oneapi/tbb/spin_mutex.h:23,
from /usr/include/oneapi/tbb/flow_graph.h:26,
from /usr/include/tbb/flow_graph.h:17,
from /home/eton/00-src/supra/src/SupraLib/SupraManager.h:21,
from /home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/SUPRA_GUI_autogen/EWIEGA46WW/../../../../../supra/src/GraphicInterface/parameterWidget.h:3,
from /home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/SUPRA_GUI_autogen/EWIEGA46WW/moc_parameterWidget.cpp:10,
from /home/eton/00-src/build-supra-Desktop_Qt_5_15_2_GCC_64bit-Debug/src/GraphicInterface/SUPRA_GUI_autogen/mocs_compilation.cpp:6:
/usr/include/oneapi/tbb/profiling.h:229:15: error: expected unqualified-id before ‘)’ token
229 | void emit() { }
| ^
/usr/include/oneapi/tbb/profiling.h:231:22: error: expected unqualified-id before ‘const’
231 | static void emit(const std::string &) { }
| ^~~~~
/usr/include/oneapi/tbb/profiling.h:231:22: error: expected ‘)’ before ‘const’
231 | static void emit(const std::string &) { }
| ~^~~~~
| )

end./

expected unqualified-id on oneapi tbb12的更多相关文章

  1. xcode构建webdriverAgent时报错Messaging unqualified id的解决办法

    在使用xcode构建webdriverAgent时,提示build failed,报错信息为:semantic issue:Messaging unqualified id,可以参考以下解决方案 xc ...

  2. Thrift Expected protocol id ffffff82 but got 0

    如果服务端配的也是noblock=false;客户端不能改成noblock=true;

  3. Statement returned more than one row, where no more than one was expected

    Statement returned more than one row, where no more than one was expected <resultMap id="Stu ...

  4. 【jQuery EasyUI系列】使用属性介绍

    1.ValidateBox The validatebox is designed to validate the form input fields.If users enter invalid v ...

  5. Quartus II Error总结与解答

    (1).Error (209015): Can't configure device. Expected JTAG ID code 0x020B20DD for device 1, but found ...

  6. XSD标准架构-----<xsd:element> 元素详解

    声明一个元素.     <element abstract = Boolean : false block = (#all | List of (extension | restriction ...

  7. 学习selenium python版最初的一个小想法

    这个还是我在刚开始学习selenium的时候做的,自己觉得有点意思,在接下来我会基于目前我对于selenium的一些深入研究,写下我对selenium的理解以及UIAutomation的一些理解,以此 ...

  8. Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  9. ubuntu1604 golang环境

    copy来的,这里记录一下 1. 升级系统: sudo apt-get upgrade 2. 安装docker 下载docker-ce: https://download.docker.com/lin ...

  10. [Oracle][RMAN] Use RMAN to Migrate database from CentOS_5-11201-SingleDB to OracleLinux_5-11204-SingleDB

    リンク:How to Move/Restore DB to New Host and File System using RMAN (Doc ID 1338193.1)https://docs.ora ...

随机推荐

  1. python入门教程之四基本语法

    1Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大 ...

  2. python程序,实现以管理员方式运行程序,也就是提升程序权限

    quest UAC elevation from within a Python script? 我希望我的Python脚本能够在Vista上复制文件. 当我从普通的cmd.exe窗口运行它时,不会生 ...

  3. [GIT]辨析/区别: git add -u | git add -A | git add . [转载]

    参考文献 git add -u与-A .三者的区别 - CSDN

  4. 五月十六号java基础知识点

    1.方法引用就是用双冒号"::"来简化Lambda表达式2.方法引用四种引用方式:1)对象名::实例方法名 //用对象名调用实例方法2)类名::静态方法名 //用类名引用静态方法 ...

  5. 活字格性能优化技巧(3):如何巧用CDN提升含页面的访问速度

    本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上两篇中我们分享了如何利用数据库主键和表格设置默认不加载数据来提升应用 ...

  6. stm32串口烧录程序

    Step1:将BOOT0设置为1,BOOT1设置为0,mcuisp软件不使用STR和DTR烧录 Step2:程序下载完成后,再将BOOT0手动跳帽接GND,复位,这样STM32才可以从Flash中启动 ...

  7. 极速免费部署,国内可用 ChatGPT 网页版

    极速免费部署,国内可用 ChatGPT 网页版 我的星球微信群虽然接入了ChatGPT,但是依然有星友反馈说艾特机器人太麻烦,有些问题也不方便公开. 昨天充值api成功了,终于有底气把网页版开放给星友 ...

  8. python和js实现AES加解密

    小白学习中...... AES算法 AES全称为高级加密标准,是Advanced Encryption Standard的首字母简写.详细了解,可以找专门的资料进行学习. 场景 开发一个web网站过程 ...

  9. 【SSM项目】尚筹网(三)基于Servlet3.0项目搭建:异常映射和拦截器机制

    1 异常映射 1.1 目标 使用异常映射对项目的异常和错误提示进行统一管理. 1.2 思路 对于普通的页面请求,异常映射机制捕获到handler方法抛出的异常后会响应为一个错误页面,对于处理ajax请 ...

  10. 帝国ECMS静态生成为一行代码/静态页面打乱教程

    一.内容页变成一行修改1.打开文件e/class/functions.php2.找到以下函数 function GetHtml($classid,$id,$add,$ecms=0,$doall=0) ...