GCC 链接器找不到标准库?
GCC linker can't find standard library?
我一直在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
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
。
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 叮叮当当找不到标准标头
- 代码库找不到标准C++库标头
- Mac OS X 上的 GCC 7 找不到C++标准库
- C++在全局命名空间中找不到非标准 C 函数
- 编译 PyGAMMA Mac Lion:g++ 找不到标准的 C++ 头文件(字符串/iostream..)
- RIOS X Mavericks上使用clang++构建的内部示例在链接上找不到STL标准库
- 在 Linux 上编译C++代码。需要使用 gcc/4.7.2。找不到标准库
- GCC 链接器找不到标准库?
- 目标 c - 在 Cocoa 项目中使用类时找不到标准C++包含C++
- c++标准库在.mm文件中找到,但在.h文件中找不到(Xcode 4.5 LLVM GCC 4.2)