Qt 使用qmake 遇到 warning LNK4042: object specified more than once; extras ignored 错误的处理办法

当同一个工程下出现两个文件名相同的cpp文件而又没办法修改文件名时,编译器链接时会报错链接错误 lnk:4042 对于qt的工程该如何解决呢?


网上有种说法:

在工程pro中加入 CONFIG += object_with_source

object_with_source — outputs each object file into the same directory its source file came from,

http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmake

尝试了下好像没效果。(它的意图是在源文件夹中生成obj文件,继而链接不同路径下的obj文件 )


另外还有种方法:

1、修改obj文件名,使用Qt的pro时要达到目的就需要修改Makefile文件

由于Qt的pro工程中并没有提供修改obj文件名的方法,所以可以通过修改qmake的源码来实现目的

修改qmake\generators\makefile.cpp


QStringList
MakefileGenerator::createObjectList(const QStringList &sources)
{
    QStringList ret;
    QString objdir;
    if(!project->values("OBJECTS_DIR").isEmpty())
        objdir = project->first("OBJECTS_DIR");
    QStringList fileNames;
    for(QStringList::ConstIterator it = sources.begin(); it != sources.end(); ++it) {
        QFileInfo fi(fileInfo(Option::fixPathToLocalOS((*it))));
        QString dir;
        if(objdir.isEmpty() && project->isActiveConfig("object_with_source")) {
            QString fName = Option::fixPathToTargetOS((*it), false);
            int dl = fName.lastIndexOf(Option::dir_sep);
            if(dl != -1)
                dir = fName.left(dl + 1);
        } else {
            dir = objdir;
        }
        QString baseName = fi.completeBaseName();
        while(fileNames.indexOf(baseName) != -1)
            baseName+="_";
        fileNames.push_back(baseName);
        ret.append(dir + baseName + Option::obj_ext);
    }
    return ret;
}


只要达到目的就可以了。

2、然后就是qmake的编译,给出一个简单的批处理

@rem 将该文件放到QT源文件根目录,注意在vs运行环境下执行该批处理
@rem 如果存在src\corelib\global\qconfig.cpp 可以不用configure命令 
@rem 复制qmake下的Makefile.win文件为Makefile ,添加下面几句话到文件头
@rem QMAKESPEC=win32-msvc2008
@rem QT_VERSION=4.8.0
@rem QMAKE_OPENSOURCE_EDITION = yes
@rem 进入qmake目录 执行nmake


if not EXIST "src\corelib\global\qconfig.cpp" (
    echo 当生成qmake后即可手动停止
    configure -platform win32-msvc2008 -debug-and-release -fast -opensource -confirm-license
    goto end;
)
if not EXIST "qmake\Makefile" (
    echo 看提示
    goto end;
)


cd qmake
nmake /f Makefile
cd ..


:end

3、这还不够另外还要使用Qt的另一个未公开CONFIG :no_batch

在pro工程中加入 CONFIG+=no_batch



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值