使用clang编译完全支持C++11的Qt5

发布: 2013-02-24 11:43

总结,通过这次折腾,

加深了对clang/llvm编译工具链的理解。

了解了些关于gcc与clang的内建原子操作机制与实现。

了解了clang当前3.2版本的一些问题。

了解了clang/llvm后续版本的一些新特性。

Qt5关于C++11的配置编译变量设置机制。

Qt5跨平台配置编译的实现机制。



软件包版本说明:

clang/llvm-3.2

libcxx-3.2

libcxxabi-svn-20130223

qt5.0.1

archlinux/kernel3.8.0/x86_64



参考资料:

*) 关于clang/libcxx/libcxxabi的讨论:http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-July/022837.html
*) clang的内置原子操作函数应用示例:http://fossies.org/unix/misc/clang-3.2.src.tar.gz:a/clang-3.2.src/test/CodeGen/atomic-ops.c

*) clang的内置函数列表:/usr/include/clang/Basic/Builtins.def





编译过程:

1)修正libcxx的头文件的问题

修改/usr/include/c++/v1/atomic文件,把has_feature替换为has_extension

#if !has_extension(cxx_atomic)

这个问题应该的libcxx-3.3-trunk中修正了。

2)编译参数

$ ./configure -v -prefix /opt/qt5 -opensource -release -shared -c++11 -platform linux-clang -make libs -make tools -make demos

3) 设置clang++支持c++11,链接libcxx与libcxxabi

修改qtbase/mkspec/linux-clang/qmake.conf

把QMAKE_LFLAGS改为: QMAKE_LFLAGS += -stdlib=libc++ -llibc++ -llibc++abi



修改qtbase/mkspec/common/clang.conf

把QMAKE_CXXFLAGS_CXX11变量设置为:QMAKE_CXXFLAGS_CXX11 = -std=c++11 -stdlib=libc++

把QMAKE_LFLAGS_CXX11变量设置为:QMAKE_LFLAGS_CXX11 = -lc++ -stdlib=libc++ -lc++abi

4) 修改Qt5源代码,让qt-script和qt-webkit支持clang-3.2的标准

*) ./qtscript/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Threading.h

*) ./qtwebkit/Source/WTF/wtf/Atomics.h
把#include 换成#include

把__gnu_cxx::__exchange_and_add(addend,1)+1替换为__atomic_add_fetch调用,

把__gnu_cxx::__exchange_and_add(addend,-1)-1替换为__atomic_sub_fetch调用,

inline int atomicIncrement(int volatile* addend) { return __atomic_add_fetch(addend, 1, std::memory_order_seq_cst); }

inline int atomicDecrement(int volatile* addend) { return __atomic_sub_fetch(addend, 1, std::memory_order_seq_cst); }



*) ./qtbase/src/corelib/thread/qbasicatomic.h

把198行QBasicAtomicInteger(const QBasicAtomicInteger &) = delete;中的=delete去掉。

QBasicAtomicInteger(const QBasicAtomicInteger &);

*) qtbase/src/corelib/thread/qmutex_linux.cpp

把63行的has_trivial_default_constructor替换为is_trivially_default_constructible,

Q_STATIC_ASSERT(std::is_trivially_default_constructible::value);



后续深入探讨:

*)现在编译出来的库和程序不会链接libstdc++.so了,但是还会链接libgcc_s.so,,研究下是否可完全替换掉gcc的影响。

*) clang链接优化参数-O4的应用问题。ld.gold和LLVMgold.so插件的应用问题。



补丁:

qt-5.0.1-clang-c++11-libcxx.patch

涉及6个文件的改动:



patch文件内容:





libcxx-3.2-atomic-check.patch

涉及1个文件的改动:

patch文件的内容:


原文: http://qtchina.tk/?q=node/715

Powered by zexport