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

Error when compiling some simple c++ code

提问人:Jean-Philippe Leclerc 提问时间:9/24/2011 最后编辑:jwwJean-Philippe Leclerc 更新时间:9/3/2019 访问量:58048

问:

我尝试在 osx lion 上编译此 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++ macOS 链接器错误

评论

4赞 David Heffernan 9/24/2011
这是一个链接器问题。你是如何链接的?
1赞 Jean-Philippe Leclerc 9/24/2011
我是 cpp 的新手,我真的不明白你的问题。:
3赞 David Heffernan 9/24/2011
你用什么指令来编译和链接?什么编译器?
0赞 Jean-Philippe Leclerc 9/24/2011
我正在用“cc”编译。示例:“cc main.cpp”
0赞 Carl Norum 9/24/2011
@Jean-菲利普·勒克莱尔 - 那是你的问题。看看我的答案。

答:

3赞 S.C. Madsen 9/24/2011 #1

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

109赞 Carl Norum 9/24/2011 #2

通常,通过调用 C 前端编译 C++ 代码时会发生此类故障。执行的 理解文件并将其编译为 C++,但不将其与 C++ 库链接。例:gcc

$ 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

如您所见,包括在内,并且 presto - 没有链接错误。libstdc++

评论

2赞 ma11hew28 4/27/2014
哎呀!我忘了将我的文件添加到命令 filenames 参数中。我只是做了.做奏效了。(我在 .other.cclangclang main.cclang main.c other.c#include "other.h"main.c
0赞 Martin Polak 6/22/2017
如果您使用的是 objc++,则需要将任何包含的 .m 文件重命名为 .mm,以便正确编译。
4赞 AndrzejJ 9/24/2011 #3

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

0赞 Frigo 9/24/2011 #4

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

评论

0赞 Carl Norum 9/24/2011
OP 的问题说“osx lion”。
6赞 Allisone 9/24/2012 #5

尝试

g++ main.cpp

这样它应该可以工作,至少使用 OS X

2赞 Alistair A. Israel 11/29/2014 #6

从优胜美地 (10.10.1) 开始,我发现使用标志也可以:gcc-lc++

gcc -lc++ main.cpp
2赞 jkhosla 12/14/2016 #7

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

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out
1赞 user1031613 4/7/2017 #8

以下是适用于 macOs Sierra 的解决方案:

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

在 10.8 及更早版本上,默认选择 libstdc++,在 10.9 上,默认选择 libc++。为了保证与 libMLi3 的兼容性,我们需要手动选择 libstdc++。

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

0赞 wangqingtao 9/3/2019 #9

因此,错误 ld: library not found for -lstdc++ 是实际错误所在。

若要解决此问题,请打开文件夹

打开 /Library/Developer/CommandLineTools/Packages/

运行软件包 macOS_SDK_headers_for_macOS_10.14.pkg

那么 gem install mini_racer 就可以工作了!

这个问题可能不仅与mini_racer有关,因为它可能会影响任何编译扩展的gem。