MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”

Posted

技术标签:

【中文标题】MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”【英文标题】:gcc 4.8 on MAC OS X 10.8 throws "Undefined symbols for architecture x86_64: " 【发布时间】:2012-08-07 19:15:20 【问题描述】:

所有,我在我的mac os x 10.8中编写了这样的代码,当我使用“gcc use_new.cpp -o use_new”编译它时,它会抛出这样的错误消息:

Undefined symbols for architecture x86_64:
  "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 ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(void const*)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(unsigned long)", referenced from:
      _main in ccr2vrRQ.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
  "std::cout", referenced from:
      _main in ccr2vrRQ.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 ccr2vrRQ.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 ccr2vrRQ.o
  "operator delete(void*)", referenced from:
      _main in ccr2vrRQ.o
  "operator new(unsigned long)", referenced from:
      _main in ccr2vrRQ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

当我使用“g++ use_new.cpp -o use_new”时可以,谁能帮助我!?谢谢你!

#include <iostream>      
    struct fish              
    
        float weight;
        int id;
        int kind;              
    ;
    int main()               
    
      using namespace std;   
      int* pt = new int;     
      *pt = 1001;            
      cout<<"int: "<<*pt<<"in location: "<<pt<<endl;
      double* pd = new double;
      *pd = 100000001.0;     
      cout<<"double: "<<*pd<<"in location: "<<pd<<endl;
      cout<<"int point pt is length "<<sizeof(*pt)<<endl;
      cout<<"double point pd is length "<<sizeof(*pd)<<endl;
      delete pt;             
      delete pd;             
      cout<<(int *)"How are you!"<<endl;
      return 0;
  

【问题讨论】:

我遇到了与i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 类似的问题,试图编译一个“Hello world”程序。开始赏金。 这已被以一种或另一种形式询问过很多次(例如here、here 或here)。你会从阅读What is the difference between g++ and gcc?中受益。 【参考方案1】:

即使是旧的 4.2 GCC 也是如此(我在设置非官方 iOS 工具链时遇到过这种情况)。 gcc 默认假定为 C,并调用链接器而不链接到 C++ 标准库;相比之下,g++ 默认采用 C++ 并链接到 C++ 标准库。

总而言之 - 可能的解决方案:

gcc myprog.c -o myprog -lstdc++

g++ myprog.c -o myprog

【讨论】:

我明白了。您会推荐使用更新版本的 GCC 吗? @Randomblue 没有更新版本的 GCC - 甚至 4.8 也在开发中。使用-lsdtc++ 进行链接,或者更好(我建议你这样做):使用 g++ 进行链接。 我正在使用g++ 运行我的程序,但我仍然得到undefined symbols for architecture x86_64【参考方案2】:

这个***问题的答案有答案

gcc and g++ linker

使用

gcc -lstdc++ use_new.cpp -o use_new

-lstdc++ 标志告诉链接器包含 C++ 标准库

http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library

我正在运行 Mac OS X 10.7.4,该库位于此处

/usr/lib/libstdc++.dylib

【讨论】:

它告诉链接器包含 C++ 标准库,编辑答案以包含它。【参考方案3】:

这与@user1582840 粘贴的代码无关,只是我的 2 美分,并且在处理我自己的一些代码时,g++ 中出现相同问题的不同原因:

由于其他原因,在 OS X 10.8/Darwin11 上使用 g++ 4.2.1 时,我收到“ld: symbol(s) not found for architecture x86_64”错误。希望这将有助于一些搜索谷歌的问题。

我收到此错误是因为我定义了一个类,在类定义中我声明了成员函数。但是,当我定义成员函数时,我忘记了包含类修饰符。

举个例子来说明我在说什么(代码示例,不是完整的程序):

class NewClass

    NewClass(); // default constructor
;

然后,在定义 NewClass() 构造函数(或任何成员函数)时,我只需要:

// don't do this, it will throw that error!!
NewClass()

    // do whatever

而不是:

// proper way
NewClass::NewClass()

    // do whatever

这是一个相当简单的错误,幸运的是我在很短的时间内设法抓住了它,但有人可能很容易错过(尤其是我们新手),以及有关 gcc/g++ 链接器、XCode、等等对此没有任何帮助:P

再次,希望对您有所帮助!

【讨论】:

以上是关于MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”的主要内容,如果未能解决你的问题,请参考以下文章

mac os 安装gcc

MAC os x 10.8+ 代码签名证书详细信息

Mac OS X 上的 GCC 标志 -Os 来自哪里?

envsubst:在 Mac OS X 10.8 上找不到命令

Mac OS X 10.8.3 上的 gfortran/gcc4.8

Mac OS X 上的 GCC 7 找不到 C++ 标准库