查看完整版本: [-- mingw编译问题,好多年一直存在? --]

QTCN开发网 -> Qt安装与发布 -> mingw编译问题,好多年一直存在? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

adonais 2020-04-16 14:45

mingw编译问题,好多年一直存在?

使用mingw编译qt5的时候,有几个multiple definition错误存在, 记得好几年前就是这样。
看看源文件,是这样的结构。
xxx.cpp 源码里包含 #include "yyy.cpp"
然后pri配置文件同时包括xxx.cpp,yyy.cpp ,那么链接器会链接xxx.o,yyy.o,
很明显xxx.o已经包含了yyy.o里面的函数,同时链接的时候就会报multiple definition.
我就很奇怪,难道官方一直使用--allow-multiple-definition参数,而没有去改动一下配置文件.
按理说vc链接的时候也会遇到多重定义的问题,但link好像没有提示.

hitler++ 2020-04-17 00:20
cpp文件include其他cpp,非常不标准的用法,很少人这样用,有问题估计也懒得修复了

fsu0413 2020-04-17 12:07
没见过这样的操作。
你说的具体是哪个文件?我有空可以去看看。

顺便这种定义应该是不会在pri里加yyy.cpp的吧。。。。

adonais 2020-04-18 21:58
fsu0413:没见过这样的操作。
你说的具体是哪个文件?我有空可以去看看。
顺便这种定义应该是不会在pri里加yyy.cpp的吧。。。。 (2020-04-17 12:07)

下面是qt5.12.8中的部分,其他版本应该也差不多是这样
qtbase\src\corelib\thread\thread.pri如下

    SOURCES += \
       thread/qmutex.cpp \
...
    win32 {
        SOURCES += \
            thread/qmutex_win.cpp \
            thread/qwaitcondition_win.cpp
    } else {
...
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
...
很奇怪msvc编译的时候没有报错,mingw编译的时候出现multiple definition错误。
不知是不是mingw编译的时候我禁用了预编译头的原因?



圣域天子 2020-04-20 12:18
明显是你自己多包含 了, win32 中的 qmutex_win.cpp 不应该加的

fsu0413 2020-04-20 22:45
看了下生成的makefile里没有qmutex_win.cpp的编译,不知道原理
推测可能是qmake耦合了这块地方,但是我没有去调查,楼主如果感兴趣的话可以调查一下

adonais 2020-04-25 13:53
fsu0413:看了下生成的makefile里没有qmutex_win.cpp的编译,不知道原理
推测可能是qmake耦合了这块地方,但是我没有去调查,楼主如果感兴趣的话可以调查一下 (2020-04-20 22:45) 

做了个测试,
q1.pro如下:
TEMPLATE = app
TARGET = q1
INCLUDEPATH += .
CONFIG -= qt debug_and_release
CONFIG += console
SOURCES += 1.c 2.c 3.c
=======================
1.c:
#include <stdio.h>
#include "2.c"
extern void bar(void);
int main(void) { foo(); bar(); return 0; }
2.c:
void foo(void) { printf("foo printf\n"); }
3.c
#include <stdio.h>
void bar(void) { printf("bar printf\n"); }
运行qmake,生成的Makefile确实不包括2.o
那么之所以出现我描述的情况,应该是使用configure时mingw预编译出来的qmake有问题.

fsu0413 2020-05-12 22:10
adonais:做了个测试,
q1.pro如下:
TEMPLATE = app
TARGET = q1
....... (2020-04-25 13:53) 

你用的mingw是哪个版本的?我这边的7.3.0没这个问题

adonais 2020-05-15 00:27
fsu0413:你用的mingw是哪个版本的?我这边的7.3.0没这个问题 (2020-05-12 22:10) 

https://sourceforge.net/projects/libportable/files/Tools/gcc-win64-9.3.1.7z

不关mingw版本的事。
既然定位到是预编译qmake的问题,把事情搞清楚就不难了
对比了一下预编译qmake和最终生成qmake之间的代码,发现跟环境变量相关。
我在编译qt之前,喜欢先设置INCLUDE和LIB环境变量,引入依赖库的路径(openssl.icu,mysql..).
把这些环境变量取消掉,生成的Makefile就正常了.

九重水 2020-05-15 14:24
神一般的用法,还没#include 过XXX.cpp文件;
一般#include xxx.h文件,然后在.h文件里面用#ifndef YYYY_H ……
所以没遇到过这么神奇的事情。

fsu0413 2020-05-18 08:32
adonais:https://sourceforge.net/projects/libportable/files/Tools/gcc-win64-9.3.1.7z
不关mingw版本的事。
既然定位到是预编译qmake的问题,把事情搞清楚就不难了
....... (2020-05-15 00:27) 

加include路径和lib可以用configure自带的命令啊。。。。动环境变量可能牵一发动全身


查看完整版本: [-- mingw编译问题,好多年一直存在? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled