2011-11-23 43 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