Qt / Objective-C ++ 11またはGCC-4.7とClangを使用したQtプロジェクトの構築

すべてに幸運を!



今日、私は親愛なる行商人に別の倒錯について話します-Glang-4.7.0コンパイラとClangを組み合わせたQtで書かれたプロジェクトをMac OS Xで組み立てることについて(ホースについて-記事の最後で、なぜ私たちも編むのかが明らかになります) )



なぜGCC 4.7が必要なのですか? たとえば、C ++ 11標準のすべてのクールな機能を使用するには。 これでは十分ですか? 新しい標準のサポートに加えて、Xcode GCC 4.2にバンドルされているものと比較して多くの改善があります(実際にはi686-apple-darwin11-llvm-g ++-4.2であることが判明しています)。したがって、4.7に切り替える点が明らかにあります。 ただし、以下に説明するように問題があります。



Cocoa



いくつかの機能が必要であると想定できます。つまり、Objcetive-Cコンパイラが必要であり、QtアプリケーションをMac OS X環境に統合するには、Objective-C ++などが必要です。



GCC-4.7.0をインストールすることから始めます。 もちろん、既製のアセンブリ(たとえば、 ここから )を使用できますが、上記のアセンブリはObjective-C [++]をサポートしていないため、Jediを使用してコンパイラのセットを自分でコンパイルします。 これは一見思われるよりも簡単です。手動ですべてを行うことができます(たとえば、 ここからの指示に従って)。または、すべての作業を行う通常のスクリプトを作成できます。 ここで、たとえば、 この議論に基づく私のスクリプトでは、brewとwgetが必要になります。



 #!/bin/bash # # This script downloads and builds GCC 4.7.0 for Mac OS X. # Depends on: brew, wget # # This file is modifyed version of script by Konrad Rudolph, found here: # http://apple.stackexchange.com/questions/38222/how-do-i-install-gcc-via-homebrew # VERSION=4.7.0 VER_SHORT=4.7 PREFIX=/usr/local/gcc-${VER_SHORT} TEMP_DIR=temp-gcc LANGUAGES=c,c++,objc,obj-c++ MAKE='make -j 4' echo "Preparing to install GCC ${VERSION}..." echo " Installation path: ${PREFIX}" echo " Temporary dir: ${TEMP_DIR}" echo " Programming languages: ${LANGUAGES}" brew-path() { brew info $1 | head -n3 | tail -n1 | cut -d' ' -f1; } # Prerequisites echo echo "Installing gmp, mpfr and libmpc using brew..." brew install gmp brew install mpfr brew install libmpc # Download & install the latest GCC echo echo "Downloading GCC sources..." mkdir -p $PREFIX mkdir ${TEMP_DIR} cd ${TEMP_DIR} wget ftp://ftp.gnu.org/gnu/gcc/gcc-${VERSION}/gcc-${VERSION}.tar.gz tar xfz gcc-$VERSION.tar.gz rm gcc-${VERSION}.tar.gz cd gcc-${VERSION} mkdir build cd build echo echo "Configuring GCC..." ../configure \ --prefix=$PREFIX \ --with-gmp=$(brew-path gmp) \ --with-mpfr=$(brew-path mpfr) \ --with-mpc=$(brew-path libmpc) \ --program-suffix=-${VER_SHORT} \ --enable-languages=${LANGUAGES} \ --with-system-zlib \ --enable-stage1-checking \ --enable-plugin \ --enable-lto \ --disable-multilib echo echo "Building GCC..." $MAKE bootstrap echo echo "Installing GCC..." make install
      
      



(その開発はgithubでフォローできます)



30分(±)ビルドした後、GCC 4.7.0が/usr/local/gcc-4.7/binにインストールされます。 これで、プロジェクトをその助けを借りて組み立てることができます。 ただし、最初に、動作するかどうかを確認してください。



 $ export PATH=/usr/local/gcc-4.7/bin:$PATH $ g++-4.7 --version g++-4.7 (GCC) 4.7.0 Copyright (C) 2012 Free Software Foundation, Inc.     .      .   - ,       - .
      
      





まあ、まったく悪くありません。 しかし、この特定のコンパイラでqmakeにプロジェクトをビルドさせるにはどうすればよいでしょうか? export PATH



加えてexport PATH



使用するコンパイラーをqmakeに指示する必要があります。 これを行うには2つの方法があります。



最初の方法は、ラフで、曲がっており、不快で、最も重要なのは、根本的に間違っています。 .proファイルでコンパイラを指定します。



 macx { QMAKE_CXX = g++-4.7 QMAKE_CXXFLAGS += -std=c++11 -v QMAKE_CXXFLAGS_X86_64 -= -Xarch_x86_64 QMAKE_CC = gcc-4.7 QMAKE_CFLAGS += -std=c++11 -v QMAKE_CFLAGS_X86_64 -= -Xarch_x86_64 QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_SHLIB = $$QMAKE_CXX QMAKE_LINK_C = $$QMAKE_CC QMAKE_LINK_C_SHLIB = $$QMAKE_CC QMAKE_LFLAGS_X86_64 -= -Xarch_x86_64 QMAKE_OBJECTIVE_CFLAGS_X86_64 -= -Xarch_x86_64 }
      
      





第二の方法、きちんとした、美しく、 正しい 。 独自のmkspec



作成してください! これを行うには、/ /usr/local/Qt4.8/mkspecs



に移動し、簡単なコマンドを実行して開始します。



 sudo cp macx-g++ macx-g++47 sudo cp common/g++-base.conf common/g++47-base.conf sudo cp common/g++-macx.conf common/g++47-macx.conf
      
      





次に、お気に入りのテキストエディター(私の場合macx-g++47/qmake.conf



)で、ファイルmacx-g++47/qmake.conf



を次の形式にします。



 MAKEFILE_GENERATOR = UNIX TARGET_PLATFORM = macx TEMPLATE = app CONFIG += qt warn_on release app_bundle incremental global_init_link_order lib_version_first plugin_no_soname link_prl QT += core gui QMAKE_INCREMENTAL_STYLE = sublib include(../common/mac.conf) include(../common/gcc-base-macx.conf) include(../common/g++47-macx.conf) load(qt_config)
      
      





実際、最後から2番目の行の中央に「47」を追加します。 次に、 common/g++47-macx.conf



編集して、次のようにします。



 include(g++47-base.conf) QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_DWARF2 QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_DWARF2 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO += -g $$QMAKE_CFLAGS_DWARF2 QMAKE_LFLAGS_STATIC_LIB += -all_load QMAKE_CFLAGS_X86_64 += -mmacosx-version-min=10.5 -std=c++11 QMAKE_CFLAGS_PPC_64 += -mmacosx-version-min=10.5 -std=c++11 QMAKE_CXXFLAGS_X86_64 = $$QMAKE_CFLAGS_X86_64 QMAKE_CXXFLAGS_PPC_64 = $$QMAKE_CFLAGS_PPC_64 QMAKE_OBJECTIVE_CFLAGS_X86_64 = $$QMAKE_CFLAGS_X86_64 QMAKE_OBJECTIVE_CFLAGS_PPC_64 = $$QMAKE_CFLAGS_PPC_64 QMAKE_LFLAGS_X86_64 = $$QMAKE_CFLAGS_X86_64 QMAKE_LFLAGS_PPC_64 = $$QMAKE_CFLAGS_PPC_64 QMAKE_OBJCFLAGS_PRECOMPILE = -x objective-c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE QMAKE_OBJCXXFLAGS_PRECOMPILE = -x objective-c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
      
      





繰り返しますが、実際には、アセンブリフラグを変更し、 マジックナンバー 47を追加するだけです。



g++47-base.conf



を終了します。



 QMAKE_CC = gcc-4.7 QMAKE_LINK_C = $$QMAKE_CC QMAKE_LINK_C_SHLIB = $$QMAKE_CC QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -g QMAKE_CXX = g++-4.7 QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_SHLIB = $$QMAKE_CXX QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_PCH_OUTPUT_EXT = .gch QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CFLAGS_USE_PRECOMPILE = -include ${QMAKE_PCH_OUTPUT_BASE} QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
      
      





画像 ここでも、数行に「-4.7」を追加しました。 まあ、それで十分でしょう。 これで、新しいmkspecで動作するようにQt Creatorを構成できます! 設定で、 Build & Run -> Tool Chains -> Add -> GCC



に移動し、[コンパイラパス]フィールドに/usr/local/gcc-4.7/bin/g++-4.7



と入力し、デバッガで- /usr/bin/gdb



に入力しますmkspec- macx-g++47



。 ツールチェーン自体は、「GCC-4.7」、「c ++ 11コンパイラ」などのようなものと呼ぶことができます。 プロジェクト設定で、新しいツールチェーンを選択できます。 -プロジェクトは、新しくコンパイルされたコンパイラーによってコンパイルされます! コンソールからこのすべてを使用する場合は、 -spec macx-g++47



パラメーター-spec macx-g++47



指定してqmakeを呼び出すだけで十分です。



さて、あなたは働くことができ、プロジェクトは組み立てられ、立ち上げられ、働いています。 しかし、いくつかの問題があります...



より正確には、問題。 それらの1つ-プロジェクトでObjective-C [++]の使用を開始しようとすると、コンパイラは少し曲がります。 なんで? 理由は簡単です:GCCのObjective-Cコンパイラはブロックを理解しません! どうして? なんで? 誰が許可しましたか? 知りませんが、事実は事実です。 したがって、C / C ++以外ではほとんど使用されません。 なんて残念。 しかし、失望しないようにしましょう! GCCを使用してObjective-C [++]コードをコンパイルできない場合、clangでアセンブルします。 これを行うには、再びg++47-base.conf



およびg++47-macx.conf



編集しg++47-macx.conf



次の行を最後にg++47-macx.conf



ます。



 # in file g++47-base.conf QMAKE_OBJECTIVE_CC = clang # in file g++47-macx.conf QMAKE_OBJECTIVE_CFLAGS += -std=c++0x -stdlib=libc++
      
      





したがって、すべてのC / C ++ソースはg ++-4.7を使用してコンパイルされ、Objective-C [++]ソースはclangを使用してコンパイルされます。 不便ですか? もちろん、不快です! C ++ 11をある程度サポートしているため、完全にclangに切り替える方が簡単だと思われます。 しかし! 彼はまだGCCから遠いので、* .mmファイルでは、C ++ 11を大量に使用しないように注意します。残念ながら、ホースはすべてに耐えることはできません。 しかし、* .cppファイルにはローミングする場所があります!



mkcpecを編集して編集することに抵抗がある場合は、 githubアクセスしてください 。そこにバージョンを投稿しました。 そして覚えておいてください! GCC 4.7は/usr/local/gcc-4.7/bin/



にインストールされるため、PATHエクスポートは不可欠です! ただし、Qt Creatorでは、プロジェクトプロパティのアセンブリ用にこのパスをPATHに追加できます。



素敵なビルドを! そして間違いが減ります!



PS:間違いを見つけたり、より良い方法を知っている場合は、コメント=)で登録を解除してください。



All Articles