2011-12-29 12 views
0

私はpush_back関数を使用しているC++プログラムをコンパイルしていました。終わりに、私はこのエラーを取得しています:あなたは_M_insert_auxを見つけるだろうが、私はその定義を見つけることができませんでしたstl_vector.hファイルで"_M_insert_aux()"への未定義の参照を克服するには?

/usr/include/c++/4.4/bits/stl_vector.h:741: 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&)' 

この問題を解決する方法を教えてください。

コードスニペット:

for (table=lex->query_tables; table; table=table->next_global) 
{ 
    string table_db=table->db; 
    table_db += ":"; 
    table_db= table_db+table->table_name; 
    current.tables.push_back(table_db); 
    DBUG_PRINT("Dip", (" %s: %s, %s",table->db, table->table_name, table->alias)); 
} 
+0

これを生成するコードを投稿できますか? – hmjd

+0

OK ...ここにするための1つのスニペット –

+0

である(表= lex-> query_tables、テーブル、テーブル=卓上> next_global) \t {\t \tストリングtable_db =卓上> DB。 \t \t table_db + = ":"; \t \t table_db = table_db + table-> table_name; \t \t current.tables.push_back(table_db); \t \t \t DBUG_PRINT( "Dip"、( "%s:%s、%s"、表 - > db、表 - >表名、表 - >別名)); } –

答えて

1

私は(main.cpp)以下で、このコンパイラエラー再現:-fno-implicit-templatesオプションがない場合には、コンパイル

g++ -fno-implicit-templates main.cpp -o main 

#include <vector> 
#include <string> 

int main() 
{ 
    std::vector<std::string> v; 
    v.push_back(std::string("test")); 
    return 0; 
} 

コンパイラのコマンドを指定された。

コンパイラフラグ-fno-implicit-templatesが指定されているかどうかを確認し、可能であれば削除してください。 -fno-implicit-templatesを構築するには

私は、ソースを変更:

#include <vector> 
#include <string> 

//class template std::vector<std::string>; TYPO here: 'class' & 'template' wrong order 
template class std::vector<std::string>; 

int main() 
{ 
    std::vector<std::string> v; 
    v.push_back(std::string("test")); 
    return 0; 
} 

EDIT:

私は、MySQL 5.1.60をダウンロードして成功し、あなたがコメントで提供configuremakeコマンドを使用して構築されました。

次のように私は、ファイル「sql_parse.cc」を編集した:

// Added these include directives before any other. 
#include <vector> 
#include <string> 

// At the end of include directives added this explicit template 
// instantiation. 
template class std::vector<std::string>; 

// Added the following lines into a random function. 
std::vector<std::string> v; 
v.push_back(std::string("1")); 

を私は再びmakeを実行し、それがコンパイルされ、正常にリンク。 注:私は-fno-implicit-templatesでコンパイルしました。私は "sql_parse.cc"に対して行ったこと以外はmysqlディストリビューションに他の変更を加えませんでした。

+0

私はそれを行いましたが、うまくいきませんでした...私はconfigureファイルからの暗黙のテンプレートを削除しました。その行(クラステンプレートstd :: vector ;)は動作しません...その他の提案plz ... –

+0

'-fno-implicit-templates'を指定すると、その行を追加するだけです。以前にコンパイルされたすべてのオブジェクトを削除するために 'make distclean'などの方法を実行しましたか? – hmjd

+0

はい私は以前のオブジェクトをすべて消去しました...その行をクリアして-fno-implicit-templatesを削除しましたが、まだエラーが発生しています。 –

関連する問題