2011-11-23 44 views
6

我在MySql 5.5.7rc的源文件sql_parse.cc中写了一些代码。在那里我使用了vector,allocator等,但编译器没有与标准模板库(STL)链接。有人可以建议我该怎么办?如何链接C++代码中的STL?

以下是错误消息:

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

请确保您使用'g ++'链接。 –

+0

“它的迫切”根本无济于事。 –

+0

取决于它有多紧急! –

回答

16

你应该已经给命令行。我怀疑您使用gcc进行链接,在这种情况下,您应该使用g++或添加-lstdc++选项。

+0

不,我也试过g + +但没有work.Was得到相同的错误。就像我所做的是“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

不,这不是我的意思,我的意思是使用'g ++'进行链接。跟踪配置和构建过程出了什么问题可能会变得棘手。你可以尝试添加'LIBS = -lstdC++'来配置行,但即使它工作,我也会关心整个事情...... –

+0

嘿,如何使用-lsdC++? 并在哪里添加? –

-2
#ifndef GLOBAL_H 
#define GLOBAL_H 

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

#endif //GLOBAL_H 

是一个好的开始

+1

'使用名称空间标准'不应出现在标题中。而且,这不涉及关于链接的问题。 – 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&)'

该符号是std::vector<std::string>一个成员函数是一个函数模板,所以应该在你的程序中实例化,而不是在C++标准库。

您是否正在编译-fno-implicit-templates选项?或者在代码中使用明确的实例化声明(即extern模板)并且不提供定义?那些将阻止编译器实例化模板。

如果你告诉编译器不提供隐含的实例,那么你将需要添加一个显式实例对每个未定义参考:

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

我得到了我的STL代码编译如下

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