g-var.com | G-VAR's Blog

VS2013编译Qt 4.8.6 x64

Thu Apr 13, 2017

转载请注明出处!

原文链接:VS2013编译Qt 4.8.6 x64


下载Qt 4.8.6源码

下载地址

源码配置

  • 将下载的qt-everywhere-opensource-src-4.8.6.zip解压,如:E:/qt-everywhere-opensource-src-4.8.6

  • 对源文件进行修改,修改内容如下:

  1. 找到./mkspecs/win32-msvc2013/qmake.conf文件,将

    QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
    QMAKE_LFLAGS_DEBUG = /DEBUG
    

    修改为

    QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO
    QMAKE_LFLAGS_DEBUG = /DEBUG /INCREMENTAL:NO
    
  2. 找到./src/3rdparty/webkit/Source/JavaScriptCore/wtf/HashSet.h文件,将

    return m_impl.add(value);
    

    修改为

    typedef typename HashSet<T, U, V>::iterator iter_type;
    auto& p = m_impl.add(value);
    return make_pair((iter_type)p.first, p.second);
    

    再将

    return m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
    

    修改为:

    typedef typename HashSet<Value, HashFunctions, Traits>::iterator iter_type;
    auto& p = m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
    return make_pair((iter_type)p.first, p.second);
    
  3. 找到./src/3rdparty/webkit/Source/JavaScriptCore/wtf/MathExtras.h文件,将

    #if COMPILER(MSVC) || (COMPILER(RVCT) && !(RVCT_VERSION_AT_LEAST(3, 0, 0, 0)))
    

    修改为

    #if COMPILER(MSVC) && _MSC_VER < 1800 || (COMPILER(RVCT) && !(RVCT_VERSION_AT_LEAST(3, 0, 0, 0)))
    

    再将

    #if COMPILER(MSVC)
    

    修改为

    #if COMPILER(MSVC) && _MSC_VER < 1800
    
  • 打开vs2013的命令行工具 ,中文名称是: “VS2013 x64 本机工具命令提示”,对应的英文名称是:”VS2013 x64 Native Tools Command Prompt”,并进入解压后的源码根目录

  • 执行配置命令:configure -opensource -nomake demos -nomake examples -platform win32-msvc2013

  • 执行nmake或打开projects.sln进行编译

注意事项

  • 编译时可能会遇到CVT1100的错误,那么需要在根目录下执行一下下面的代码(Python 2.7)对工程文件进行处理:
  import sys
  import os
  from xml.etree import ElementTree

  def updateProject(filename):

      def getXmlns(tag):
          return tag[1:].split('}')[0]

      tree = ElementTree.parse(filename)
      root = tree.getroot()
      xmlns = getXmlns(root.tag)
      for cb in root.iter('{' + xmlns + '}CustomBuild'):
          if(not 'Include' in cb.attrib):
              continue
          if(not cb.attrib['Include'].endswith('.res')):
              continue
          for excl in cb.iter('{' + xmlns + '}ExcludedFromBuild'):
              if('Condition' in excl.attrib):
                  del excl.attrib['Condition'] # delete ExcludedFromBuild condition
      ElementTree.register_namespace('', xmlns)
      tree.write(filename)

  if(len(sys.argv)>=2): # use project files specified in command line:
      for i in range(1, len(sys.argv)):
          updateProject(sys.argv[i])
  else: # recursively update all project files in current directory:
      rootdir = os.getcwd()
      for root, subFolders, files in os.walk(rootdir):        
          for filename in files:
              if(filename.endswith('.vcxproj')):
                  filePath = os.path.join(root, filename)
                  print "file: %s" % (filePath)
                  updateProject(filePath)
  • 如果在配置时加入了-webkit选项,那么可能会遇到如下两个编译错误:
  1. TESTS_SOURCE_DIR相关的错误,需要在出错的源文件中定义define TESTS_SOURCE_DIR "E:/qt-everywhere-opensource-src-4.8.6/src/3rdparty/webkit/Source/WebKit/qt/tests/"
  2. 找不到_HBeginPaint_HEndPaint符号定义的错误,是因为这两个函数的定义是在PaintHooks.asm中,而在编译时并没有对该文件进行编译。解决办法如下:
    • 选中webcore工程,右键->添加->现有项,将PaintHooks.asm加入工程中,在Source Files分类下可以找到该文件
    • 选中webcore工程,右键->生成依赖项->生成自定义,勾选masm(.targets .props)选项并确定
    • 选中PaintHooks.asm文件,右键->属性->常规,将“项类型”修改为Microsoft Macro assembler,然后点击确定
    • 选中PaintHooks.asm文件,右键->编译
    • 重新编译Solution

[ 转载必须在正文中标注并保留原文链接等信息。]



  « Previous: Next: »