clang - sublimetext2 C++ 11代码用 `clang++` 编译,但不使用 `clang x c++`

  显示原文与译文双语对照的内容
133 1

基本问题

我有以下代码

#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++,并尝试在上面编译我的代码 Fragmentclang -x c++ -std=c++11 -stdlib=libc++ cpptest.cpp( 或者不同的排列) 相反,但这失败了,对链接器的抱怨。

我的问题是 clang++clang -x c++的区别是什么?是否可以使用 clang -x c++ 而不是 clang++ 来编译上面的代码 Fragment?

我的机器是一台运行 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

差异和解决方案?

我可以找到的唯一区别是当我使用 -x c++ 标志运行of时,-lc++ 标志不会在以 "/usr/bin/lb" 开头的行中添加。当我编译时clang -v -lc++ -x c++ -stdlib=libc++ cpptest.cpp我仍然不明白 clang++clang -x c++ 命令是如何不同的,但这似乎使我的示例程序编译成了不同的。

我的sublime text 2问题解决方案

这一整个 Bug 寻找都是我尝试了解如何让 sublime text 2停止抱怨我实际工作的代码。需要做的只是按照这里的指令进行操作,并设置包括

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

SublimeClang.sublime-settings 文件中。

时间:原作者:0个回答

87 5

对,只有连接阶段才有区别。你可以使用-c标志来编译 clang,你将得到相同的结果。

然后添加-lc++标志,boths示例将出现在。

原作者:
...