GCC链接器找不到标准库?

xan*_*ood 5 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
Run Code Online (Sandbox Code Playgroud)

编译每个目标文件工作正常,但当它到达"全部"链接步骤时,它似乎不知道标准库.我从"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
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 20

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

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

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

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

  • 抱歉这个愚蠢的问题,这确实解决了它。这只是令人沮丧,因为我之前在 C++ 中使用过 GCC,我的导师告诉我们 GCC 和 G++ 会在必要时相互调用,并且本质上是相同的。非常感谢! (3认同)
  • 这不是一个愚蠢的问题。我有 12 年的 C++ 开发经验,但没有 Linux 上的经验。总是“每个人都知道”的事情会让你进入一个新的环境。 (3认同)

小智 5

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