在Visual studio 2013上编译QT4.8.6

时间:2022-04-25 08:46:06


在Visual studio 2013上编译QT4.8.6

出现如下错误:
.\wtf/MathExtras.h(117) : error C2491: “round”: 不允许 dllimport 函数 的定义
.\wtf/MathExtras.h(124) : error C2491: “roundf”: 不允许 dllimport 函数 的定义
.\wtf/MathExtras.h(146) : error C2084: 函数“bool signbit(double)”已有主体
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\math.h(32
4) : 参见“signbit”的前一个定义
d:\repos\libpacks\src\3rdparty\qt-everywhere-opensource-src-4.8.6\src\3rdparty\w
ebkit\source\javascriptcore\runtime\JSValueInlineMethods.h(168) : error C2264:
“signbit”: 函数定义或声明中有错误;未调用函数
dtoa.cpp
.\wtf/MathExtras.h(117) : error C2491: “round”: 不允许 dllimport 函数 的定义
.\wtf/MathExtras.h(124) : error C2491: “roundf”: 不允许 dllimport 函数 的定义
.\wtf/MathExtras.h(146) : error C2084: 函数“bool signbit(double)”已有主体
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\math.h(32
4) : 参见“signbit”的前一个定义
DecimalNumber.cpp
.\wtf/MathExtras.h(117) : error C2491: “round”: 不允许 dllimport 函数 的定义
.\wtf/MathExtras.h(124) : error C2491: “roundf”: 不允许 dllimport 函数 的定义
.\wtf/MathExtras.h(146) : error C2084: 函数“bool signbit(double)”已有主体
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\math.h(32
4) : 参见“signbit”的前一个定义

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

错误代码位置在~\qt-everywhere-opensource-src-4.8.6\src\3rdparty\webkit\Source\JavaScriptCore\wtf\MathExtras.h
line 113 :修改成
#if (COMPILER(MSVC) && _MSC_VER < 1800) || (COMPILER(RVCT) && !(RVCT_VERSION_AT_LEAST(3, 0, 0, 0)))
line 147 :修改成
#if COMPILER(MSVC) && _MSC_VER < 1800
inline bool signbit(double num) { return _copysign(1.0, num) < 0; }
#endif

错误2
.\wtf/HashSet.h(180) : error C2664: “std::pair<WTF::HashTableConstIteratorAdapt
er<WTF::HashTable<void *,void *,WTF::IdentityExtractor<void *>,WTF::PtrHash<JSC:
:EncodedJSValue>,WTF::HashTraits<JSC::EncodedJSValue>,WTF::HashTraits<JSC::Encod
edJSValue>>,void *>,bool>::pair(const std::pair<WTF::HashTableConstIteratorAdapt
er<WTF::HashTable<void *,void *,WTF::IdentityExtractor<void *>,WTF::PtrHash<JSC:
:EncodedJSValue>,WTF::HashTraits<JSC::EncodedJSValue>,WTF::HashTraits<JSC::Encod
edJSValue>>,void *>,bool> &)”: 无法将参数 1 从“std::pair<WTF::HashTableIterato
r<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>,bool>”转换为“const std::
pair<WTF::HashTableConstIteratorAdapter<WTF::HashTable<void *,void *,WTF::Identi
tyExtractor<void *>,WTF::PtrHash<JSC::EncodedJSValue>,WTF::HashTraits<JSC::Encod
edJSValue>,WTF::HashTraits<JSC::EncodedJSValue>>,void *>,bool> &”
        with
        [
            Key=void *
,            Value=void *
,            Extractor=WTF::IdentityExtractor<void *>
,            HashFunctions=WTF::PtrHash<JSC::EncodedJSValue>
,            Traits=WTF::HashTraits<JSC::EncodedJSValue>
,            KeyTraits=WTF::HashTraits<JSC::EncodedJSValue>
        ]
        原因如下:  无法从“std::pair<WTF::HashTableIterator<Key,Value,Extractor,
HashFunctions,Traits,KeyTraits>,bool>”转换为“const std::pair<WTF::HashTableCon
stIteratorAdapter<WTF::HashTable<void *,void *,WTF::IdentityExtractor<void *>,WT
F::PtrHash<JSC::EncodedJSValue>,WTF::HashTraits<JSC::EncodedJSValue>,WTF::HashTr
aits<JSC::EncodedJSValue>>,void *>,bool>”
        with
        [
            Key=void *
,            Value=void *
,            Extractor=WTF::IdentityExtractor<void *>
,            HashFunctions=WTF::PtrHash<JSC::EncodedJSValue>
,            Traits=WTF::HashTraits<JSC::EncodedJSValue>
,            KeyTraits=WTF::HashTraits<JSC::EncodedJSValue>
        ]
        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
        .\wtf/HashSet.h(179): 编译类 模板 成员函数“std::pair<WTF::HashTableCons
tIteratorAdapter<WTF::HashTable<void *,void *,WTF::IdentityExtractor<void *>,WTF
::PtrHash<JSC::EncodedJSValue>,WTF::HashTraits<JSC::EncodedJSValue>,WTF::HashTra
its<JSC::EncodedJSValue>>,void *>,bool> WTF::HashSet<void *,WTF::PtrHash<JSC::En
codedJSValue>,WTF::HashTraits<JSC::EncodedJSValue>>::add(void *const &)”时
        d:\repos\libpacks\src\3rdparty\qt-everywhere-opensource-src-4.8.6\src\3r
dparty\webkit\source\javascriptcore\heap\MarkStack.h(74): 参见对正在编译的函数
模板 实例化“std::pair<WTF::HashTableConstIteratorAdapter<WTF::HashTable<void *,
void *,WTF::IdentityExtractor<void *>,WTF::PtrHash<JSC::EncodedJSValue>,WTF::Has
hTraits<JSC::EncodedJSValue>,WTF::HashTraits<JSC::EncodedJSValue>>,void *>,bool>
 WTF::HashSet<void *,WTF::PtrHash<JSC::EncodedJSValue>,WTF::HashTraits<JSC::Enco
dedJSValue>>::add(void *const &)”的引用
        d:\repos\libpacks\src\3rdparty\qt-everywhere-opensource-src-4.8.6\src\3r
dparty\webkit\source\javascriptcore\heap\MarkStack.h(195): 参见对正在编译的类 模
板 实例化“WTF::HashSet<void *,WTF::PtrHash<JSC::EncodedJSValue>,WTF::HashTraits
<JSC::EncodedJSValue>>”的引用


修改的方法
~\qt-everywhere-opensource-src-4.8.6\src\3rdparty\webkit\Source\JavaScriptCore\wtf\HashSet.h
line 180:

    将180行所在的函数以及它下面的函数用下面的代码替换:

    template<typename T, typename U, typename V>
    inline pair<typename HashSet<T, U, V>::iterator, bool> HashSet<T, U, V>::add(const ValueType& value)
    {
      //  return m_impl.add(value);
        auto p= m_impl.add(value);
        return make_pair(typename HashSet<T,U,V>::const_iterator(p.first), p.second);
    }

    template<typename Value, typename HashFunctions, typename Traits>
    template<typename T, typename HashTranslator>
    inline pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool>
    HashSet<Value, HashFunctions, Traits>::add(const T& value)
    {
       // typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
       // return m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
        typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
        typedef typename HashSet<Value, HashFunctions, Traits>::iterator iter_type;
        auto& temp = m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
        return make_pair((iter_type)temp.first, temp.second);
    }

    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
错误3
     platform\DefaultLocalizationStrategy.cpp(327) : error C2001: newline in constant
     platform\DefaultLocalizationStrategy.cpp(327) : fatal error C1057: unexpected end of file in macro expansion
    
     这个错误的原因是因为代码里面的非英文的引号造成的。

    原始的错误代码位置:
    ~\qt-everywhere-opensource-src-4.8.6\src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp
    代码如下:
    #if USE(CF)
        RetainPtr<CFStringRef> selectedCFString(AdoptCF, truncatedStringForLookupMenuItem(selectedString).createCFString());
        return formatLocalizedString(WEB_UI_STRING("Look Up “%@”", "Look Up context menu item with selected word"), selectedCFString.get());
    #else
        return WEB_UI_STRING("Look Up “<selection>”", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));
    #endif
    #endif

     <selection> 单词前后的引号。就是它造成编译报错。修改成下面的代码

    #if USE(CF)
        RetainPtr<CFStringRef> selectedCFString(AdoptCF, truncatedStringForLookupMenuItem(selectedString).createCFString());
        return formatLocalizedString(WEB_UI_STRING("Look Up \"%@\"", "Look Up context menu item with selected word"), selectedCFString.get());
    #else
        return WEB_UI_STRING("Look Up \"<selection>\"", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));
    #endif
    #endif