您的位置:首页 > 移动开发 > Objective-C

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

2012-04-30 15:14 1231 查看
当同一个工程下出现两个文件名相同的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐