Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AndreyPlusPlus
1 / 1 / 0
Регистрация: 26.09.2016
Сообщений: 13
#1

Исправить ошибки при подключении сторонней библиотеке - C++

14.11.2016, 01:51. Просмотров 148. Ответов 2

Здравствуйте. В дополнение темы. Короче, была проблема, что попытался включить внешнюю библиотеку, и было множество ошибок компиляции.

Я исправил все ошибки грубой силой. Взял и исправил текст. Например, было множество таких ошибок. Также были ошибки области видимости (protected), ошибки адресов к локальным хэдер-файлам проекта - я также все исправил прямым редактированием текста.

В частности, по поводу
to_string is not a member of std
Я сделал такой "хак" по советам из интернета.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef STRING_PATCH_H
#define STRING_PATCH_H
 
 
#include <string>
#include <sstream>
 
 
namespace patch
{
    template < typename T > std::string to_string( const T& n )
    {
        std::ostringstream stm ;
        stm << n ;
        return stm.str() ;
    }
 
    unsigned long long stoull( const std::string& n1 )
    {
        char** ptr = 0;
        return strtoull( n1.c_str(), ptr, 10 );
    }
 
    long stol( const std::string& n1, char** n2, int n3 )
    {
        return strtoll( n1.c_str(), n2, n3 );
    }
 
    float stof( const std::string& n1 )
    {
        char** ptr = 0;
        return strtof( n1.c_str(), ptr );
    }
}
 
#endif // STRING_PATCH_H
Соответственно, везде stoull (std::stoull также не работала) я везде заменил на patch::stoull.

После всего этого компиляция прошла успешно, компьютер долго-долго думал, а потом линковщик выдал 50+ ошибок
Код
<...>
In function `ZN5patch6stoullERKSs':
multiple definition of `patch::stoull(std::string const&)'
first defined here
In function `ZN5patch4stolERKSsPPci':
multiple definition of `patch::stol(std::string const&, char**, int)'
first defined here
In function `ZN5patch4stofERKSs':
multiple definition of `patch::stof(std::string const&)'
<...>
Код
<...>
 undefined reference to `std::string::c_str() const'
 undefined reference to `std::string::c_str() const'
 undefined reference to `std::string::c_str() const'
 undefined reference to `__gxx_personality_sj0'
 undefined reference to `std::string::length() const'
<...>
В чем проблема? Во-первых, откуда имя функции ZN5patch4stolERKSsPPci, это вообще что? Во-вторых, почему неработоспособен такой хак? И как же написать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2016, 01:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исправить ошибки при подключении сторонней библиотеке (C++):

Исправить ошибки линковки при подключении библиотек Ilu - C++
Здравствуйте подскажите как исправить, уже 2 день пытаюсь и ничего не получается. Подключил библиотеки в вижак, скинул либы в папку либ,...

Ошибки при подключении библиотеки SFML - C++
Знаю тема уже заезжана, но никак не могу разобратся в чём проблема. 1) IDE visual studio 2015 community edition x64 2) SFML 2.4.0...

При подключении заголовочного файла появляются ошибки переопределения функций - C++
Знаю, что эта тема размусолена, но попрошу немного добра. Пишу отдельный модуль с процедурами обработки двусвязного списка. При...

Ошибки при подключении tinyxml: Unexpected end of file while looking for precompiled header - C++
Скачал tinyxml с офф сайта(проектом выходит) подключил файлы tinystr.h tinystr.cpp tinyxml.h tinyxml.cpp tinyxmlerror.cpp ...

Можно ли как-то исправить слишком большой размер файла при подключении библиотеки iostream? - C++
Здравия всем! если откомпилировать это: #include &lt;stdio.h&gt; int main() { printf(&quot;text&quot;); return 0; ...

Исправить ошибки при построении решения - C++
Почему MS VS 2012 ultimate может выводить 20 ошибок компиляции при построении этого кода: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

2
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3874 / 2132 / 548
Регистрация: 18.10.2014
Сообщений: 3,743
14.11.2016, 02:10 #2
Цитата Сообщение от AndreyPlusPlus Посмотреть сообщение
В чем проблема?
В том, что вы засунули определения нешаблонных неинлайновых функций в заголовочный файл. Замем вы повключали этот заголовочный файл в множество единиц трансляции и вуаля - готово нарушение Правила Одного Определения (One Definition Rule) для patch::stoull, patch::stol и patch::stof, о котором вам и вопит линкер.

В вашем случае разумнее всего просто объявить все эти функции inline.

Цитата Сообщение от AndreyPlusPlus Посмотреть сообщение
откуда имя функции ZN5patch4stolERKSsPPci, это вообще что?
Это внутренние имена для ваших функций, подвергнутые name mangling. То есть в имени еще и закодирована сигнатура функции (пространство имен, типы и кол-во параметров и т.п.) Линкер работает именно с такими именами.

Цитата Сообщение от AndreyPlusPlus Посмотреть сообщение
undefined reference to `std::string::c_str() const'
А вот откуда это взялось - пока не ясно.

В частности здесь говорится, что "undefined reference to `__gxx_personality_sj0'" является следствием подключения библиотек с разными (несовместимыми) механизмами обработки исключений.

P.S. Отдельно стоит подумать, зачем вам вообще понадобился этот патч. Это какой-то малоперспективный подход. Устаревший компилятор и библиотека? Или просто забыли указать -std=c++11 в настройках?
0
AndreyPlusPlus
1 / 1 / 0
Регистрация: 26.09.2016
Сообщений: 13
18.11.2016, 00:08  [ТС] #3
Ясно, спасибо за ответ. Я думаю, что ошибки были вызваны тем, что не определены какие-нибудь еще макросы, вроде _WIN32_WINNT. Возможно... Я не знаю. Пока я немного забросил этот код, пытаясь подойти к проблеме с другого конца. Начну с чистых примеров для boost, в которых меньше кода.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2016, 00:08
Привет! Вот еще темы с ответами:

Исправить ошибки при работе с функцией rand - C++
Он просто выводит максимальное число вместо того чтобы выводить рандомное или я что то не так делаю? Ознакомьтесь с правилами форума. ...

Как исправить ошибки при компиляции проекта? - C++
Недавно набросал достаточно много классов, для проекта. Но ошибок компиляции получилось почему то ну очень много. И я не понимаю как их...

Краш при создании чекпоинта: найти и исправить ошибки в коде - C++
RPC_CALLBACK CRPCCallback::SetPlayerCheckpointEx(RPC_ARGS) { CVector pos; float size; unsigned int col; unsigned short...

При переводе программы с VS c++ 6.0 на VS c++ 2010 express выходят ошибки, как их исправить? - C++
На Vusial Studio c++ 6.0 все прекрасно работало, но стоило мне все это перевести на visual c++ 2010 express, то вышли ошибки и куча...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru