编译一些简单的c ++代码时出错

我尝试在osx狮子上编译这个cpp代码,但是我得到一个错误。

#include <iostream> using namespace std; int main (int argc, char *argv[]) { for(int i = 0; i < 10; i++) { cout << "hi"; cout << endl; } return 0; } 

编译:

 cc main.cpp 

错误:

 Undefined symbols for architecture x86_64: "std::cout", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from: _main in ccBdbc76.o "std::ios_base::Init::Init()", referenced from: __static_initialization_and_destruction_0(int, int)in ccBdbc76.o "std::ios_base::Init::~Init()", referenced from: ___tcf_0 in ccBdbc76.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status 

通常,这种失败发生在通过调用C前端来编译C ++代码时。 您执行的gcc可以理解和编译文件为C ++,但不会将其与C ++库链接。 例:

 $ gcc example.cpp Undefined symbols for architecture x86_64: "std::cout", referenced from: _main in ccLTUBHJ.o "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: _main in ccLTUBHJ.o "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: _main in ccLTUBHJ.o "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from: _main in ccLTUBHJ.o "std::ios_base::Init::Init()", referenced from: __static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o "std::ios_base::Init::~Init()", referenced from: ___tcf_0 in ccLTUBHJ.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status $ g++ example.cpp $ 

正如你所看到的,使用g++会让问题消失。 如果你使用clang (我推荐)会发生同样的行为(带有稍微不同的消息):

 $ clang example.cpp Undefined symbols for architecture x86_64: "std::ios_base::Init::~Init()", referenced from: ___cxx_global_var_init in cc-IeV9O1.o "std::ios_base::Init::Init()", referenced from: ___cxx_global_var_init in cc-IeV9O1.o "std::cout", referenced from: _main in cc-IeV9O1.o "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: _main in cc-IeV9O1.o "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: _main in cc-IeV9O1.o "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from: _main in cc-IeV9O1.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) $ clang++ example.cpp $ 

正如你在clang错误信息中看到的那样,你可以使用-v来查看链接器的调用,看看有什么问题。 它会告诉你这个链接:

 "/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a 

或者类似的东西 – 正如你所看到的,它是链接C运行时,而不是C ++,也没有C ++库。 使用clang++的连接线是:

 "/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o /usr/lib/libstdc++.6.dylib -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a 

正如你所看到的,包含libstdc++ ,并且presto – 没有链接错误。

尝试

 g++ main.cpp 

这样它应该工作,至less使用OS X

我不熟悉OSX LION。 但是,从最严格的意义上讲,所描述的错误不是由编译器引起的,而是由链接器引起的。 看起来好像标准库没有被链接。

使用CC命令(大写)编译C ++并链接到标准C ++库。

从优胜美地(10.10.1)开始,我发现带有-lc++标志的gcc也可以工作:

 gcc -lc++ main.cpp 

以下是在macOs Sierra上运行的解决scheme:

在OS X上有两种标准C ++库的实现:libstdc ++和libc ++。 它们不是二进制兼容的,libMLi3需要libstdc ++。

在10.8和更早版本中,默认情况下selectlibstdc ++,在10.9上默认selectlibc ++。 为了确保与libMLi3的兼容性,我们需要手动selectlibstdc ++。

为此,请将-stdlib = libstdc ++添加到链接命令。

在Windows(MinGW)或Linux上是GCC吗? 在MinGW上,您需要参数-lmingw32 -enable-auto-import 。 Linux可能需要类似的东西, -enable-auto-import是最可能需要的。

如果在OS X上使用clang,请尝试:

 clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out