未定义对'std :: cout'的引用


193

这是示例吗?

#include <iostream>
using namespace std;
int main()
{
    cout << "Hola, moondo.\n";
}

它引发错误:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)':
main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

另外,此示例:

#include <iostream>
int main()
{
    std::cout<<"Hola, moondo.\n";
}

引发错误:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

注意:我正在使用Debian Wheezy。


158
尝试g++代替gccgcc是针对C的,不会让您访问C ++标准库。
juanchopanza 2015年

2
好吧,那肯定解决了问题。据我了解,GCC是Gnu Compiler Collection的首字母缩写。需要时不应该调用g ++编译器吗?因此,命令gcc改为调用c编译器...
D1X 2015年

1
@ D1X是因为您从编译器中单独调用了链接器。在编写时,gcc -o edit main.o它不知道main.o将需要C ++启动库。
MM


4
问:是否在需要时调用g ++编译器?答:根据需要,调用gfortran,gjc,...等的方法不超过gcc。
paulsm4

Answers:


274

用以下命令编译程序:

g++ -Wall -Wextra -Werror -c main.cpp -o main.o
     ^^^^^^^^^^^^^^^^^^^^ <- For listing all warnings when your code is compiled.

就像coutC ++标准库中存在的一样,使用时需要显式链接。默认情况下链接标准库。-lstdc++gccg++

使用gcc,(g++应优先于gcc

gcc main.cpp -lstdc++ -o main.o

11
可以用来编译C ++代码,但事实是它不与C ++库链接gcc如果您添加,将可以正常工作-lstdc++
一些程序员哥们2015年

3
-Wall在提供gcc / g ++命令行示例时,请始终添加-有助于使菜鸟在早期阶段养成良好的习惯,并节省每个人的时间。;-)
Paul R

4
自iostreams何时开始std::cout成为标准模板库的一部分?
TC

1
为什么需要-Werror?我已经对文档进行了修改,如果我理解得很好,将会导致警告错误,并使我的项目难以编译。
D1X 2015年

7
@ D1X:因为程序员中有一个讨厌的习惯,就是忽略警告。实际上,-Wall甚至-Wextra警告的所有内容都是非常实际的问题,或者是很容易解决的草率编码。这里的信息是要养成一种习惯,在这种习惯下,您认为编译器警告是对代码可以在何处进行改进的有用指针,而不是令人讨厌的提示。有数以百计的在这里做题,不会是必要摆在首位,如果OP已经使用-Wall -Wextra-Werror只是在强化这一点。
DevSolar 2015年


2

制作文件

如果您正在使用一个makefile,并且您像我一样最终出现在这里,则可能是您正在寻找的内容或:

如果使用的是makefile,则需要进行cc如下更改

my_executable : main.o
    cc -o my_executable main.o

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.