【问题标题】:GCC linker can't find standard library?GCC 链接器找不到标准库?
【发布时间】:2012-02-12 20:28:10
【问题描述】:

我一直在用 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++ linker c++-standard-library


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
          gcc main.o StackList.o world.o Farm.o -g -o Project1
      

      你认为这个命令行中的什么告诉gcc 链接到 C++ 标准库中?没有链接 C++ 文件。您尚未指定语言。你调用编译器为gcc

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

          • 抱歉这个愚蠢的问题,确实解决了它。这只是令人沮丧,因为我之前在 C++ 中使用过 GCC,而且我的导师告诉我们,GCC 和 G++ 都会在必要时相互调用,并且本质上是相同的。非常感谢!
          • 不是一个愚蠢的问题。我有 12 年的 C++ 开发经验,但不是在 Linux 上。让你进入一个新环境的总是“每个人都知道”的事情。
          猜你喜欢
          • 1970-01-01
          • 2017-05-30
          • 1970-01-01
          • 1970-01-01
          • 2013-05-22
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多