2011-11-23 19 views
6

Escribí un código en el archivo fuente sql_parse.cc de MySql 5.5.7rc. Ahí he usado vector, allocator, etc. pero el compilador no está vinculado con la Biblioteca de plantillas estándar (STL). ¿Alguien puede sugerirme qué debo hacer?Cómo vincular STL en código de C++?

Aquí está el error msg:

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

Asegúrate de usar 'g ++' para vincular. –

+0

"Es urgente" no ayudaría en absoluto. –

+0

¡Depende de lo urgente que sea! –

Respuesta

16

Usted debería haber dado la línea de comandos. Sospecho que usa gcc para vincular, en cuyo caso debe usar g++ o agregar la opción -lstdc++.

+0

No probé g ++ también, pero no funcionó. Estaba recibiendo el mismo error. Como lo que hice es "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, eso no es lo que quiero decir, quise usar' g ++ 'para enlazar. Hacer un seguimiento de lo que está mal con la configuración y el proceso de compilación puede ser complicado. Puede intentar agregar 'LIBS = -lstdC++' para configurar la línea, pero me preocuparía todo, incluso si funciona ... –

+0

¿Cómo se usa -lsdC++ ?? ¿Y dónde agregar esto? –

-2
#ifndef GLOBAL_H 
#define GLOBAL_H 

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

#endif //GLOBAL_H 

es un buen comienzo

+1

'using namespace std' nunca debería aparecer en un encabezado. Y, esto no se relaciona con una pregunta sobre la vinculación. – 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&)'

Ese símbolo es una función miembro de std::vector<std::string> y es una plantilla de función, por lo que debería ser instanciada en su programa, no en el C++ biblioteca estándar.

¿Está compilando con la opción -fno-implicit-templates? ¿O utilizando una declaración de creación de instancias explícita (es decir, extern plantilla) en su código y no proporciona la definición? Esos evitarían que el compilador instanciara la plantilla.

Si usted está diciendo que el compilador no proporcionar instanciaciones implícitas, entonces tendrá que añadir una instanciación explícita para cada referencia indefinida:

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

tengo mi código de STL para compilar con la siguiente

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