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

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

Восстановить пароль Регистрация
 
AndreyPlusPlus
1 / 1 / 0
Регистрация: 26.09.2016
Сообщений: 13
14.11.2016, 01:51     Исправить ошибки при подключении сторонней библиотеке #1
Здравствуйте. В дополнение темы. Короче, была проблема, что попытался включить внешнюю библиотеку, и было множество ошибок компиляции.

Я исправил все ошибки грубой силой. Взял и исправил текст. Например, было множество таких ошибок. Также были ошибки области видимости (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, это вообще что? Во-вторых, почему неработоспособен такой хак? И как же написать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2016, 01:51     Исправить ошибки при подключении сторонней библиотеке
Посмотрите здесь:

C++ Код службы, которая издает звуковой сигнал в начале каждого часа. Исправить ошибки при компиляции
При переводе программы с VS c++ 6.0 на VS c++ 2010 express выходят ошибки, как их исправить? C++
C++ При подключении заголовочного файла появляются ошибки переопределения функций
Ошибки при подключении tinyxml: Unexpected end of file while looking for precompiled header C++
C++ Ошибки при подключении библиотеки SFML
На новом десктопе открыть калькулятор при помощи WinAPI (найти и исправить ошибки в коде) C++
Решить уравнение при помощи функций (найти причины возникновения ошибок и исправить эти ошибки) C++
Исправить ошибки при работе с функцией rand C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
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 в настройках?
AndreyPlusPlus
1 / 1 / 0
Регистрация: 26.09.2016
Сообщений: 13
18.11.2016, 00:08  [ТС]     Исправить ошибки при подключении сторонней библиотеке #3
Ясно, спасибо за ответ. Я думаю, что ошибки были вызваны тем, что не определены какие-нибудь еще макросы, вроде _WIN32_WINNT. Возможно... Я не знаю. Пока я немного забросил этот код, пытаясь подойти к проблеме с другого конца. Начну с чистых примеров для boost, в которых меньше кода.
Yandex
Объявления
18.11.2016, 00:08     Исправить ошибки при подключении сторонней библиотеке
Ответ Создать тему

Метки
boost, c++, include
Опции темы

Текущее время: 10:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru