'std :: cout' için tanımsız başvuru


197

Bu örnek olacak mı:

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

Hatayı atar:

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

Ayrıca, bu örnek:

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

hatayı atar:

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

Not: Debian Wheezy kullanıyorum.


161
g++Bunun yerine deneyin gcc. gccC içindir ve size C ++ standart kütüphanesine erişim izni vermez.
juanchopanza

2
Bu kesinlikle sorunu çözdü. Anladığım kadarıyla GCC, Gnu Derleyici Koleksiyonu'nun kısaltmasıdır. Gerektiğinde g ++ derleyicisini çağırmamalı mı? Yani gcc komutu c derleyicisini çağırır ...
D1X

1
@ D1X çünkü bağlayıcıyı derleyiciden ayrı olarak çağırdınız. yazdığın zamangcc -o edit main.o bunun main.oC ++ başlangıç ​​kitaplıklarına ihtiyacı olacağını bilmiyor .
MM


4
S: Gerektiğinde g ++ derleyicisini çağırmamalı mı? C: Gcc'den daha fazlası gerektiğinde gfortran, gjc, ... vb.
paulsm4

Yanıtlar:


278

Programı şununla derleyin:

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

olarak coutgerekir C ++ standart kütüphane, mevcut olan açık bağlama ile -lstdc++kullanıldığında gcc; g++standart kitaplığı varsayılan olarak bağlar.

İle gcc, ( g++tercih edilmeli gcc)

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

11
Olabilir C ++ kodu derlemek için kullanılacak, şey olmamasıdır bağlantı C ++ kütüphanesi ile. gccsadece eklerseniz iyi çalışır -lstdc++.
Bazı programcı ahbap

3
Lütfen -Wallgcc / g ++ komut satırı örnekleri verirken her zaman dahil edin - noobs'u erken bir aşamada iyi alışkanlıklara sokmaya yardımcı olur ve herkesin zamandan daha fazla tasarruf etmesini sağlar. ;-)
Paul R

4
Ne zamandan beri iostreams ve std::coutStandart Şablon Kütüphanesinin bir parçası?
TC

1
-Yani neden gereklidir? Dokümanları revize ettim ve iyi anlarsam uyarı hatalarını yapacak ve projelerimin derlenmesini daha az kolaylaştıracak.
D1X

7
@ D1X: Çünkü programcılar arasında uyarıları görmezden gelmek için kötü bir alışkanlık var . Hemen hemen her şey uyarır -Wallve hatta -Wextrauyarır, ya çok gerçek bir problemdir ya da kolayca düzeltilebilen özensiz kodlamadır. Buradaki mesaj, derleyici uyarılarını rahatsızlık vermek yerine kodunuzun geliştirilebileceği yararlı bir işaretçi olarak gördüğünüz bir alışkanlığa girmektir. Burada , OP kullansaydı, ilk etapta gerekli olmayacak olan SO hakkında yüzlerce soru var -Wall -Wextra. -Werrorbasitçe bunu güçlendiriyor.
DevSolar

42

Evet, g++komutu kullanmak benim için çalıştı:

g++ my_source_code.cpp

1
sonra koşmak./a.out
kaleidawave

2

Makefile'lar

Bir makyaj dosyasıyla çalışıyorsanız ve burada benim gibi olduysanız, muhtemelen aradığınız şey budur:

Bir makefile kullanıyorsanız, ccaşağıda gösterildiği gibi değiştirmeniz gerekir

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

için

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.