使用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 把__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 后续深入探讨: *)现在编译出来的库和程序不会链接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
|