2011-11-23 16 views
6

Ho scritto del codice nel file sorgente sql_parse.cc di MySql 5.5.7rc. Lì ho usato vector, allocator, ecc, ma il compilatore non è collegato con la libreria di modelli standard (STL). Qualcuno mi può suggerire cosa dovrei fare?Come collegare STL nel codice C++?

Ecco il msg di errore:

libsql.a(sql_parse.cc.o): In function `std::vector<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > >::push_back(std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&)': 
sql_parse.cc:(.text._ZNSt6vectorISsSaISsEE9push_backERKSs[std::vector<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > >::push_back(std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&)]+0x74): undefined reference to 
`std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 
std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > 
>::_M_insert_aux(__gnu_cxx::__normal_iterator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > >, std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&)' 

collect2: ld returned 1 exit status 
+1

Assicurati di usare 'g ++' per collegare. –

+0

"La sua urgenza" non aiuterebbe affatto. –

+0

Dipende da quanto sia urgente! –

risposta

16

Avresti dovuto data la linea di comando. Sospetto che tu usi gcc per il collegamento, nel qual caso dovresti usare g++ o aggiungere l'opzione -lstdc++.

+0

No ho provato anche g ++ ma non ha funzionato. Avevo lo stesso errore. Come quello che ho fatto è "sudo ./configure --prefix =/usr/local/mysql --with-plugin-partition --with-tcp-port = 3308 --with-unix-socket-path =/tmp/mysql1 .sock --with-debug CXX = g ++ " –

+0

no, non è quello che intendo, intendevo usare' g ++ 'per il collegamento. Rintracciare ciò che è sbagliato nel processo di configurazione e creazione può essere complicato. Puoi provare ad aggiungere 'LIBS = -lstdC++' per configurare la linea, ma sarei preoccupato per l'intera cosa anche se funziona ... –

+0

Ehi come usare -lsdC++ ?? E dove aggiungere questo? –

-2
#ifndef GLOBAL_H 
#define GLOBAL_H 

#include<iostream> 
#include<string> 
#include<vector> 
#include<algorithm> 
#include<cmath> 
using namespace std; 

#endif //GLOBAL_H 

è un buon inizio

+1

'using namespace std' non dovrebbe mai apparire in un'intestazione. E questo non si riferisce a una domanda sul collegamento. – Potatoswatter

0

undefined reference to std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > ::_M_insert_aux(__gnu_cxx::__normal_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

Quel simbolo è una funzione membro di std::vector<std::string> ed è un modello di funzione, quindi dovrebbe essere istanziato nel programma, non in C++ libreria standard.

Si sta compilando l'opzione -fno-implicit-templates? O utilizzando una dichiarazione di istanziazione esplicita (ad esempio il modello extern) nel codice e non fornendo la definizione? Quelli impedirebbero al compilatore di creare un'istanza del modello.

Se stai dicendo al compilatore di non fornire istanze implicite allora si avrà bisogno di aggiungere un'istanza esplicito per ogni riferimento non definito:

template void std::vector<std::string>::_M_insert_aux(std::vector<std::string>::iterator, std::string const&); 
0

ho ottenuto il mio codice STL per compilare con il seguente

g++ -std=c++11 file.cpp -o prog