2011-11-23 7 views
6

ソースファイルsql_parse.ccのコードをMySql 5.5.7rcに書きました。そこではvector,allocatorなどを使用しましたが、コンパイラは標準テンプレートライブラリ(STL)にリンクされていません。誰が私に何をすべきか教えてもらえますか?ここでC++コードでSTLをリンクする方法は?

はエラー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

リンクするには 'g ++'を必ず使用してください。 –

+0

「その緊急」はまったく役に立たないでしょう。 –

+0

緊急度によります! –

答えて

16

あなたはコマンドラインを与えてくれたはずです。どんな場合にはg++を使用するか、-lstdc++オプションを付けるかのいずれかの場合、gccをリンクに使用することが考えられます。

+0

いいえ、私もg ++を試しましたが、動作しませんでした。同じエラーが発生しました。私がやったように "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

'using namespace std'は決してヘッダに現れてはいけません。そして、これはリンクについての質問には関係しません。 – 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 
関連する問題