qmake "The *= operator"

本文深入解析了Qtwenkit测试例子中的*=和~=运算符的作用,包括它们如何在变量中添加值以及替换匹配的表达式。

 

今天浏览了下Qtwenkit的测试例子(./src/testlib/testlib.pro),发现其中的pro中有:

DEFINES *= QT_NO_CAST_TO_ASCII \
    QT_NO_CAST_FROM_ASCII \
    QTESTLIB_MAKEDLL \
    QT_NO_DATASTREAM
 
 对 *= 赋值的意思有点模糊了,应该是如果没有赋值过才执行赋值的意思。 经查看文档,确认了就是这个意思:
 
The *= operator adds a value to the list of values in a variable, but only if it is not already present. This prevents values from being included many times in a variable. For example:
  下面例子:如果还没有定义QT_DLL,那么就定义它:
 DEFINES *= QT_DLL
In the above line, QT_DLL will only be added to the list of pre-processor defines if it is not already defined. Note that the unique() function can also be used to ensure that a variables only contains one instance of each value.


The ~= operator replaces any values that match a regular expression with the specified value:

 DEFINES ~= s/QT_[DT].+/QT
In the above line, any values in the list that start with QT_D or QT_T are replaced with QT.

使用ASAN检查嵌入式Qt程序,报错: AddressSanitizer:DEADLYSIGNAL ================================================================= ==1667==ERROR: AddressSanitizer: SEGV on unknown address 0x0000aa000030 (pc 0xffff860984d0 bp 0xfffff41ce460 sp 0xfffff41ce440 T0) ==1667==The signal is caused by a READ memory access. #0 0xffff860984d0 in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084d0) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #1 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #2 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #3 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #4 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #5 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #6 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #7 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #8 0xffff860984dc in QWidgetRepaintManager::removeDirtyWidget(QWidget*) (/usr/lib/libQt6Widgets.so.6+0x2084dc) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #9 0xffff86088ca8 in QWidgetPrivate::hide_helper() (/usr/lib/libQt6Widgets.so.6+0x1f8ca8) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #10 0xffff8608e014 in QWidgetPrivate::setVisible(bool) (/usr/lib/libQt6Widgets.so.6+0x1fe014) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #11 0xffff8606cdb4 in QStackedLayout::insertWidget(int, QWidget*) (/usr/lib/libQt6Widgets.so.6+0x1dcdb4) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #12 0xaaaabb73ce88 in Form_Mainning::formBelt1New() ../appHDQt6/form_mainning.cpp:142 #13 0xaaaabb73b808 in Form_Mainning::Form_Mainning(QWidget*) ../appHDQt6/form_mainning.cpp:65 #14 0xaaaabb4f5858 in Form001::Init_UI_3() ../appHDQt6/form001.cpp:356 #15 0xaaaabb4f08e4 in operator() ../appHDQt6/form001.cpp:188 #16 0xaaaabb515594 in __invoke_impl<void, Form001::Form001(QWidget*)::<lambda()>&> /home/shz/esm8400/sysroots/armv8a-poky-linux/usr/include/c++/13.2.0/bits/invoke.h:61 #17 0xaaaabb5139bc in __invoke_r<void, Form001::Form001(QWidget*)::<lambda()>&> /home/shz/esm8400/sysroots/armv8a-poky-linux/usr/include/c++/13.2.0/bits/invoke.h:111 #18 0xaaaabb511548 in _M_invoke /home/shz/esm8400/sysroots/armv8a-poky-linux/usr/include/c++/13.2.0/bits/std_function.h:290 #19 0xaaaabb529e10 in std::function<void ()>::operator()() const (/mnt/mmc/app+0x409e10) (BuildId: 878df87093cb1409cfd6a26a32d4ae6613459ee4) #20 0xaaaabb4f3218 in Form001::doNextInitStep() ../appHDQt6/form001.cpp:261 #21 0xaaaabbb4247c in MainForm::timer_100ms_timeout() ../appHDQt6/mainform.cpp:235 #22 0xaaaabbb4a568 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (MainForm::*)()>::call(void (MainForm::*)(), MainForm*, void**) /home/shz/esm8400/sysroots/armv8a-poky-linux/usr/include/QtCore/qobjectdefs_impl.h:145 #23 0xaaaabbb4a314 in void QtPrivate::FunctionPointer<void (MainForm::*)()>::call<QtPrivate::List<>, void>(void (MainForm::*)(), MainForm*, void**) /home/shz/esm8400/sysroots/armv8a-poky-linux/usr/include/QtCore/qobjectdefs_impl.h:182 #24 0xaaaabbb49eb8 in QtPrivate::QCallableObject<void (MainForm::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) /home/shz/esm8400/sysroots/armv8a-poky-linux/usr/include/QtCore/qobjectdefs_impl.h:553 #25 0xffff84185f24 (/usr/lib/libQt6Core.so.6+0x1d5f24) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #26 0xffff84194ec0 in QTimer::timeout(QTimer::QPrivateSignal) (/usr/lib/libQt6Core.so.6+0x1e4ec0) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #27 0xffff841776c8 in QObject::event(QEvent*) (/usr/lib/libQt6Core.so.6+0x1c76c8) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #28 0xffff86032af4 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (/usr/lib/libQt6Widgets.so.6+0x1a2af4) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) #29 0xffff8411f438 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (/usr/lib/libQt6Core.so.6+0x16f438) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #30 0xffff842d0644 in QTimerInfoList::activateTimers() (/usr/lib/libQt6Core.so.6+0x320644) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #31 0xffff843feab0 (/usr/lib/libQt6Core.so.6+0x44eab0) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #32 0xffff833899e0 (/usr/lib/libglib-2.0.so.0+0x599e0) (BuildId: eb99250a153a1fa3ba4c4ae4a9f476a8c3025a5e) #33 0xffff8338d314 (/usr/lib/libglib-2.0.so.0+0x5d314) (BuildId: eb99250a153a1fa3ba4c4ae4a9f476a8c3025a5e) #34 0xffff8338dae4 in g_main_context_iteration (/usr/lib/libglib-2.0.so.0+0x5dae4) (BuildId: eb99250a153a1fa3ba4c4ae4a9f476a8c3025a5e) #35 0xffff843fed54 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (/usr/lib/libQt6Core.so.6+0x44ed54) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #36 0xffff8412c638 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (/usr/lib/libQt6Core.so.6+0x17c638) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #37 0xffff841285dc in QCoreApplication::exec() (/usr/lib/libQt6Core.so.6+0x1785dc) (BuildId: 327783ffbf0f24f15eae55b3e28debf853364919) #38 0xaaaabbb2b19c in main ../appHDQt6/main.cpp:275 #39 0xffff83ad84b0 (/usr/lib/libc.so.6+0x284b0) (BuildId: 072aa0139d531aa05fb99dfc4566f5f0829f3a0c) #40 0xffff83ad8588 in __libc_start_main (/usr/lib/libc.so.6+0x28588) (BuildId: 072aa0139d531aa05fb99dfc4566f5f0829f3a0c) #41 0xaaaabb383aec in _start ../sysdeps/aarch64/start.S:98 AddressSanitizer can not provide additional info. SUMMARY: AddressSanitizer: SEGV (/usr/lib/libQt6Widgets.so.6+0x2084d0) (BuildId: 0e0cb0994dd566d54cd5d5454dd607787094b859) in QWidgetRepaintManager::removeDirtyWidget(QWidget*) ==1667==ABORTING
11-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值