Как связать STL в коде c ++? - PullRequest
7 голосов
/ 23 ноября 2011

Я написал некоторый код в исходном файле sql_parse.cc из MySql 5.5.7rc. Там я использовал vector, allocator и т. Д., Но компилятор не связан со стандартной библиотекой шаблонов (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

Ответы [ 4 ]

17 голосов
/ 23 ноября 2011

Вы должны были дать командную строку. Я подозреваю, что вы используете gcc для связи, и в этом случае вы должны либо использовать g++, либо добавить -lstdc++.

0 голосов
/ 25 августа 2017

Я получил свой код stl для компиляции со следующим

g++ -std=c++11 file.cpp -o prog
0 голосов
/ 30 июля 2014

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 голосов
/ 30 июля 2014
#ifndef GLOBAL_H
#define GLOBAL_H

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

#endif  //GLOBAL_H

хорошее начало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...