qt之库编译错误:qmutex_linux.cpp:multiple definition of 'QBasicMutex::lockInternal(int)'

本文详细解析了在编译Qt库时遇到的错误,主要原因是qmutex_linux.cpp被重复包含,导致链接错误。通过调整工程文件,删除重复的源文件引用,成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误描述

.obj/qmutex_linux.o: In function QBasicMutex::lockInternal()': qmutex_linux.cpp:(.text+0x0): multiple definition ofQBasicMutex::lockInternal()'
.obj/qmutex.o:qmutex.cpp:(.text+0x150): first defined here
.obj/qmutex_linux.o: In function QBasicMutex::lockInternal(int)': qmutex_linux.cpp:(.text+0x60): multiple definition ofQBasicMutex::lockInternal(int)'
.obj/qmutex.o:qmutex.cpp:(.text+0x2a8): first defined here
.obj/qmutex_linux.o: In function QBasicMutex::unlockInternal()': qmutex_linux.cpp:(.text+0x1e0): multiple definition ofQBasicMutex::unlockInternal()'
.obj/qmutex.o:qmutex.cpp:(.text+0x550): first defined here
collect2: error: ld returned 1 exit status
Makefile:1241: recipe for target '../../lib/libQt5Core.so.5.13.0' failed
make[3]: *** [../../lib/libQt5Core.so.5.13.0] Error 1
make[3]: Leaving directory '/home/firefly/Downloads/build_qt/qtbase/src/corelib'
Makefile:226: recipe for target 'sub-corelib-make_first' failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory '/home/firefly/Downloads/build_qt/qtbase/src'
Makefile:50: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/home/firefly/Downloads/build_qt/qtbase'
Makefile:63: recipe for target 'module-qtbase-make_first' failed
make: *** [module-qtbase-make_first] Error 2

错误原因

        这是由于在源码文件qtbase/src/corelib/thread/qmutex.cpp中有以下代码:

#ifdef QT_LINUX_FUTEX
#  include "qmutex_linux.cpp"
#elif defined(Q_OS_MAC)
#  include "qmutex_mac.cpp"
#elif defined(Q_OS_WIN)
#  include "qmutex_win.cpp"
#else
#  include "qmutex_unix.cpp"
#endif

        这是为了兼容不同平台的代码。但是在工程文件qtbase/src/corelib/thread/thread.pri中同时又包含以下代码:

SOURCES += \
   thread/qatomic.cpp \
   thread/qmutex.cpp \
   thread/qreadwritelock.cpp \
   thread/qsemaphore.cpp \
   thread/qthreadpool.cpp \
   thread/qthreadstorage.cpp

win32 {
    SOURCES += \
        thread/qmutex_win.cpp \
        thread/qwaitcondition_win.cpp
} else {
    darwin {
        SOURCES += thread/qmutex_mac.cpp
    } else: linux {
        SOURCES += thread/qmutex_linux.cpp
    } else {
        SOURCES += thread/qmutex_unix.cpp
    }
    SOURCES += thread/qwaitcondition_unix.cpp
}

        这两个地方对文件qmutex_linux.cpp进行了重复包含,所以造成了在编译期间检测到两个文件中有相同的符号。

解决方法

        可以删除qtbase/src/corelib/thread/thread.pri文件中SOURCESqmutex_linux.cpp的引用,例如:

SOURCES += \
   thread/qatomic.cpp \
   thread/qmutex.cpp \
   thread/qreadwritelock.cpp \
   thread/qsemaphore.cpp \
   thread/qthreadpool.cpp \
   thread/qthreadstorage.cpp

win32 {
    SOURCES += \
    	thread/qmutex_win.cpp \    			/* 手动删除本行 */
        thread/qwaitcondition_win.cpp
} else {
    darwin {
        SOURCES += thread/qmutex_mac.cpp	/* 手动删除本行 */
    } else: linux {
        SOURCES += thread/qmutex_linux.cpp	/* 手动删除本行 */
    } else {
        SOURCES += thread/qmutex_unix.cpp	/* 手动删除本行 */
    }
    SOURCES += thread/qwaitcondition_unix.cpp
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值