GCC 链接器找不到标准库?

GCC linker can't find standard library?

本文关键字:标准 找不到 链接 GCC      更新时间:2023-10-16

我一直在XCode中开发一个学校项目。最终的产品必须以带有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

编译每个对象文件都很好,但当它进入"全部"链接步骤时,它似乎不知道标准库。从"cin"到"basic_string",再到"operator new",我都会得到"未定义符号"错误。

我的印象是,这些事情不需要直接指出,事实上,过去也不需要这样做。

知道可能会发生什么吗?

编辑:

如果有帮助的话,下面是(很长的)错误消息的开始:

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
要链接C++代码,需要使用g++命令,而不是gcc命令。

在编译时,由于.cpp后缀,gcc命令知道它正在编译C++代码(但无论如何,使用g++命令都是个好主意)。

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

(名称gcc既指通常用于编译C代码的命令,也指整个"GNU编译器集合",这一事实可能有点令人困惑。)

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

此外,除了第一个和最后一个目标之外,您可以忽略所有目标。make已经知道如何将.cpp文件编译为.o——您不必告诉它如何。

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

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

在这个命令行中,您认为告诉gcc在C++标准库中链接什么?没有正在链接的C++文件。您尚未指定语言。并且您将compilter调用为gcc