无法在我的OSX上编译“hello world”cpp程序

3

我在我的Mac上写了一个Hello World程序,但是编译时编译器输出了一个错误:

Undefined symbols for architecture x86_64:
  "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in endian0-654ab7.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in endian0-654ab7.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::cout", referenced from:
      _main in endian0-654ab7.o
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in endian0-654ab7.o
  "___cxa_begin_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
      ___clang_call_terminate in endian0-654ab7.o
  "___cxa_end_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
  "___gxx_personality_v0", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in endian0-654ab7.o
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in endian0-654ab7.o
      Dwarf Exception Unwind Info (__eh_frame) in endian0-654ab7.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是代码程序:
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    cout<< "hello world";
    return 0;
}

你如何构建你的程序? - Eiko
我使用 gcc -o endian endian0.cpp,就像在Linux中一样。 - Liu Hao
根据trojanfoe的建议,尝试使用clang++。 - paxdiablo
2个回答

5

看起来你缺少(链接失败)C++运行库。虽然你没有展示用于编译和链接程序的命令行,但这应该可以解决问题:

$ clang++ -o hello hello.cpp

2
我使用命令 gcc -o endian endian0.cpp,但为什么编译器没有检测到它是一个C++文件? - Liu Hao
2
它确实有影响;问题在于你没有使用 g++,因此它不知道要包含 C++ 运行库。 - trojanfoe
1
我记得读过g++只是Mac上clang++的一个前端,所以这可能就是答案。 - paxdiablo

1

您也可以尝试这样做。这是用于将库链接到链接器的方法。这里是C++运行时库。

clang -l c++ -o hello hello.cpp

我更倾向于使用clang++。

-l标志不会改变标准符合性,它用于指定要链接的库。这里的-l c++表示链接libc++库。每当需要libstdc++库时,它都无法工作。你必须加上-l stdc++。所以最好使用clang++,它将管理所有所需的C++系统库。


"I would prefer"是一种观点。如果您能用一些关于为什么它是更好的选择的事实来替换它,那将会更好。 - David Buck
-l标志不会改变标准符合性,它用于指定要链接的库。这里的-l c++表示链接libc++。每当您需要libstdc++库时,它将无法工作。您必须放置-l stdc++。因此,最好使用clang++,它将管理所有所需的C++系统库。 - guptaatul91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接