GCC链接器找不到标准库?

时间:2012-01-18 03:16:10

标签: c++ linker c++-standard-library

我一直在XCode开发一个学校项目。最终产品必须在源代码中使用makefile提交,因此我编写了一个makefile并开始编译,以确保我有一个工作副本。这是我的makefile:

all: main.o StackList.o world.o Farm.o
        gcc main.o StackList.o world.o Farm.o -g -o Project1

main.o:
        gcc -g -c main.cpp

StackList.o:
        gcc -g -c Stacklist.cpp

world.cpp:
        gcc -g -c world.cpp

Farm.cpp:
        gcc -g -c Farm.cpp

clean:
        rm *.o Project1

编译每个目标文件的工作正常,但是当它到达" all,"链接步骤,它似乎不知道标准库。我得到了#34;未定义的符号"从" cin"到" basic_string",到" operator new&#34 ;.

的每一个错误

我的印象是这些东西不需要直接表示,事实上过去并不需要这样做。

知道可能会发生什么吗?

编辑:

如果有帮助,这里是(非常长的)错误消息的开头:

Undefined symbols for architecture x86_64:
  "std::cin", referenced from:
  _main in main.o
  "std::cout", referenced from:
      _main in main.o
      Farm::print(int)  in Farm.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      _main in main.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in main.o
      __static_initialization_and_destruction_0(int, int)in StackList.o
      __static_initialization_and_destruction_0(int, int)in world.o
      __static_initialization_and_destruction_0(int, int)in Farm.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in main.o
      ___tcf_0 in StackList.o
      ___tcf_0 in world.o
      ___tcf_0 in Farm.o
  "operator new(unsigned long)", referenced from:
      doStackSearch(std::basic_istream<char, std::char_traits<char> >*, std::list<Farm*, std::allocator<Farm*> >*&)in world.o

4 个答案:

答案 0 :(得分:20)

要链接C ++代码,您需要使用g++命令,而不是gcc命令。

编译时,gcc命令知道它正在编译C ++代码,因为.cpp后缀(但最好还是使用g++命令)。

链接时,gcc命令只会看到一堆.o个文件。 g++命令与gcc命令的不同之处在于它知道在哪里可以找到特定于C ++的库。

(名称gcc同时引用命令(通常用于编译C代码)和“GNU编译器集合”作为一个整体,这一事实可能有点令人困惑。)

答案 1 :(得分:1)

您需要使用g++来编译和链接C ++源代码,而不是gcc

此外,您可以省去除第一个和最后一个之外的所有目标。 make知道如何将.cpp文件编译为.o - 您无需告诉它如何。

答案 2 :(得分:0)

我知道这很旧,但是如果您要编译和链接C ++,则可以自己指定标准库。在命令末尾添加-lstdc++

答案 3 :(得分:-2)

    gcc main.o StackList.o world.o Farm.o -g -o Project1

您认为此命令行中的内容告诉gcc在C ++标准库中链接?没有链接的C ++文件。您尚未指定语言。并且您将编译器调用为gcc