5

基本問題

次のコードがあります

#include <iostream>
#include <cstdint>
using namespace std;
int main ()
{
  int32_t spam;
  spam=5;
  cout << "Hello World! We like " << spam << endl;
  return 0;
}

私が行うと、これはうまくコンパイルされますclang++ -stdlib=libc++ cpptest.cpp。ただし、Sublime Text 2 の優れた SublimeClang パーサーは、それを理解していないようです。clang -x c++の代わりに を使用していることが原因である可能性があると考え、代わりに (またはそのさまざまな順列)clang++を使用して上記のスニペットをコンパイルしようとしましclang -x c++ -std=c++11 -stdlib=libc++ cpptest.cppたが、リンカについて不平を言ってひどく失敗しました。

だから私の質問は、 とどうclang++違うのclang -x c++ですか? 上記のスニペットをclang -x c++代わりに使用してコンパイルすることは可能clang++ですか?

私のマシンは、Mountain Lion を実行している 2012 MacBook Air です。

デバッグのもの

仕事に戻って、これでもう少し遊んで、さまざまなバージョンの詳細な出力を比較しました。

通話中clang -x c++

私が走るとき、私clang -v -x c++ -stdlib=libc++ cpptest.cppは得る

Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.1
Thread model: posix
 "/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.8.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name cpptest.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 134.9 -v -resource-dir /usr/bin/../lib/clang/4.1 -fmodule-cache-path /var/folders/8m/b4wllzbs67d9zxcj1dd8q6912jclkf/T/clang-module-cache -stdlib=libc++ -fdeprecated-macro -fdebug-compilation-dir /Users/me/Desktop -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/8m/b4wllzbs67d9zxcj1dd8q6912jclkf/T/cpptest-1eOyZn.o -x c++ cpptest.cpp
clang -cc1 version 4.1 based upon LLVM 3.1svn default target x86_64-apple-darwin12.2.1
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/c++/v1
 /usr/local/include
 /usr/bin/../lib/clang/4.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o a.out /var/folders/8m/b4wllzbs67d9zxcj1dd8q6912jclkf/T/cpptest-1eOyZn.o -lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
[snip]
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

通話中clang++

私が呼び出すclang++ -v -stdlib=libc++ cpptest.cppと、次のようになります。

clang++ -v -stdlib=libc++ cpptest.cpp 
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.1
Thread model: posix
 "/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.8.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name cpptest.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 134.9 -v -resource-dir /usr/bin/../lib/clang/4.1 -fmodule-cache-path /var/folders/8m/b4wllzbs67d9zxcj1dd8q6912jclkf/T/clang-module-cache -stdlib=libc++ -fdeprecated-macro -fdebug-compilation-dir /Users/me/Desktop -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/8m/b4wllzbs67d9zxcj1dd8q6912jclkf/T/cpptest-E7FTDV.o -x c++ cpptest.cpp
clang -cc1 version 4.1 based upon LLVM 3.1svn default target x86_64-apple-darwin12.2.1
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/c++/v1
 /usr/local/include
 /usr/bin/../lib/clang/4.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o a.out /var/folders/8m/b4wllzbs67d9zxcj1dd8q6912jclkf/T/cpptest-E7FTDV.o -lc++ -lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a

違いと解決策は?

私が見つけることができる唯一の大きな違いは、フラグを指定してclangを実行すると、-x c++-lc++始まる行の最後にフラグが追加されないこと"/usr/bin/lb"です。代わりに でコンパイルするとclang -v -lc++ -x c++ -stdlib=libc++ cpptest.cpp、すべてが機能します。clang++とコマンドがどのように異なるはずなのかまだ正確にはわかりませんclang -x c++が、これにより、少なくともサンプルプログラムがコンパイルされ、コマンドがリンカで異なることを行うことを示しているようです。

私のSublime Text 2の問題の解決策

この小さなバグハント全体は、Sublime Text 2 が実際に動作するコードについて不平を言うのをやめる方法を見つけようとしているところから始まりました。必要だったのは、こちらの指示に従い、インクルードを次のように設定することだけでした。

/usr/lib/c++/v1
/usr/include/c++/4.2.1
/usr/include/c++/4.2.1/ext

SublimeClang.sublime-settingsファイルで。

4

1 に答える 1

3

あなたが正しい。リンクステージのみの違いがあります。-cフラグを使用してコンパイルのためだけにclangを実行すると、同じ結果が得られます。

次に、-lc ++フラグを追加すると、両方のサンプルが同じになります。

于 2012-12-04T14:00:18.707 に答える