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. 二进制安装Kubernetes(k8s) v1.25.0 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.25.0 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支 ...

  2. day06-SpringCloud Ribbon

    SpringCloud Ribbon 1.Ribbon介绍 1.1Ribbon是什么? 官网地址:Netflix/ribbon: Ribbon(github.com) SpringCloud Ribb ...

  3. day104:MoFang:个人中心页面&flask-admin&基于faker生成仿真数据

    目录 BUG:登陆跳转并解决页面卡顿现象 1.前端显示个人中心页面 2.flask-Admin构建和配置后台运营站点管理用户信息 3.基于Faker生成仿真测试数据 BUG:登陆跳转并解决页面卡顿现象 ...

  4. 前端获取不到环境变量NODE_ENV

    有时候我们期望通过执行不同的 npm script 来区分诸如 dev.prod.uat.sit等多环境下使用的不同变量 今天我也在整环境变量,碰到一个小小的bug.装了 cross-env 但还是没 ...

  5. Maven的大概了解及总结setting和pom

    前言:项目中经常要用到Maven,从来也没有配置过,直到当人问到Maven是干什么的,是怎么管理项目的?一头雾水,所以写了这篇博客,首先附上百度百科的词条: Maven项目对象模型(POM),可以通过 ...

  6. node使用react项目启动错误TSError: ⨯ Unable to compile TypeScript:

    1.错误内容 return new TSError(diagnosticText, diagnosticCodes) ^ TSError: ⨯ Unable to compile TypeScript ...

  7. 数据分析02-(pandas介绍、jupyter notebook)

    数据分析-02 数据分析-02 pandas pandas介绍 pandas核心数据结构 Series DataFrame 核心数据结构操作 复合索引 Jupyter notebook 数据加载 处理 ...

  8. 《流畅的Python》第二版上市了,值得入手么?

    <Fluent Python>第一版在 2015 年出版,简体中文版<流畅的Python>在 2017 年出版.从那时起,它就成为了所有 Python 程序员的必读之书.如果一 ...

  9. Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) 小记

    在机房其它人都有许多的橙名小号后我终于大号上橙了(果然还是太菜了),写篇博客记录一下. 计数水平太弱,赛场最后 5 分钟乱糊了一个 F 的做法,后来发现其它人做法都短好多. A & B &am ...

  10. Django笔记三十八之发送邮件

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十八之发送邮件 这一篇笔记介绍如何在 Django 中发送邮件. 在 Python 中,提供了 smtplib 的邮件模块,而 Djan ...