今日、私は親愛なる行商人に別の倒錯について話します-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
繰り返しますが、実際には、アセンブリフラグを変更し、
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:間違いを見つけたり、より良い方法を知っている場合は、コメント=)で登録を解除してください。