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. Let's Encrypt 泛域名证书申请

    泛域名 泛域名证书又名通配符证书是SSL证书中的其中一种形式,一般会以通配符的形式(如:*.domain.com)来指定证书所要保护的域名. OV证书和DV证书都会有通配符的域名形式提供,而EV证书一 ...

  2. [Linux]常用命令之【diff】

    1 概述 2 diff命令 diff 命令是 Linux 上比较重要的命令行工具,用于比较文本内容,并找到不相同的地方,diff 在命令行中打印每一行的改动之处. diff 程序的输出被称为补丁(pa ...

  3. [MySQL]set autocommit=0与start transaction的区别[转载]

    set autocommit=0指事务非自动提交,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务. 1.不管autocommit 是1还是 ...

  4. 四月十九号java基础知识

    1.总括:类的继承是使用已有的类为基础派生出新的类.通过类继承的方式,便能开发出新的类,而不需要编写相同的程序代码,所以说类的继承是程序代码再利用的概念抽象与接口都是类概念的扩展.通过继承扩展出的子类 ...

  5. openGauss Datakit安装部署

    一.问题描述:目前找不到任何关于opengauuss Datakit安装部署的文档,自己来尝试踩坑. DataKit是一个以资源(物理机,数据库)为底座的开发运维工具,将上层的开发运维工具插件化,各插 ...

  6. BISS-C 8通道采集renishaw传感器及其CRC校验

    背景 BISS-C 是常见的位置编码器传输协议,相对于传统的协议,支持更快的传输速度,电器接口为电压差分RS422或者485,抗干扰能力较强,在精密位置传输中应用广泛. 下述信息源自雷尼绍 典型的请求 ...

  7. MySQL(十四)分析查询语句Explain 七千字总结

    分析查询语句:EXPLAIN 1概述 ​ 定位了查询慢的SQL之后,就可以使用EXPLAIN或者DESCRIBE工具做针对性的分析查询.两者使用方法相同,并且分析结果也是相同的. ​ MySQL中有专 ...

  8. v-if与v-for的优先级

    在Vue2中 v-for的优先级要高于v-if 在Vue3中 v-if 的优先级要高于v-for

  9. 安装vue-lic

    vue-cli是Vue.js开发的标准工具.它简化了程序员基于webppack创建工程化的Vue项目的过程.引用自vue-cli官网上的一句话:程序员可以专注在撰写应用上,而不必花好几天去纠结webp ...

  10. API Gateway vs Load Balancer:选择适合你的网络流量管理组件

    本文从对比了 API Gateway 和 Load Balancer 的功能区别,帮助读者更好地了解他们在系统架构中扮演的角色. 作者陈泵,API7.ai 技术工程师. 原文链接 由于互联网技术的发展 ...