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

Не получается скомпилировать и использовать файл .lib - C++

Восстановить пароль Регистрация
 
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.10.2013, 01:35     Не получается скомпилировать и использовать файл .lib #1
Хаюшки, мечтал сделать свою мини-библиотечку и за одно научиться работать с lib файлами, но нормального руководства нет, все либо дотошно пытаются объяснить как сделать ее в Wizard'е вижлы, либо как подключать готову d3dx.lib например.
Подкорректируйте мои начинания, в мастере VS9 функции объявлены как extern может ошибка в этом ? :

Заголовочный файл converter.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
#define WIN32_LEAN_AND_MEAN
 
#include <boost/lexical_cast.hpp>
#include <string>
#include <sstream>
#include <iostream>
 
 
                   inline std::string  ToString(const bool &value);
template <class T> inline std::string  ToString(const T &value);
template <class T> inline std::string  ToString(const T &value, const int &size_upon_point);
                   inline std::wstring ToWString(const bool &value);
template <class T> inline std::wstring ToWString(const T &value);
template <class T> inline std::wstring ToWString(const T &value, const int &size_upon_point);
 
inline int    ToInt  (const std::string & str);
inline float  ToFloat(const std::string & str);
inline double Round  (double value,int count);

Модуль converter.cpp
Кликните здесь для просмотра всего текста
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "converter.h"
 
inline std::string ToString(const bool &value){if (value) return "true"; else return "false";}
inline std::wstring ToWString(const bool &value){if (value) return L"true"; else return L"false";}
template <typename T>
inline std::string  ToString (const T &value){return boost::lexical_cast<std::string>(value);}
template <typename T>
inline std::wstring ToWString(const T &value){return boost::lexical_cast<std::wstring>(value);}
 
inline int ToInt(const std::string & str)
{
    return boost::lexical_cast<int>(str.c_str());
}
inline float ToFloat(const std::string & str)
{
    return boost::lexical_cast<float>(str.c_str());
}
 
template <typename T>
inline std::string ToString(const T &value, const int &size_upon_point)
{
    std::string result = boost::lexical_cast<std::string>(value);
    int count = result.length();
    int i = 0;
    int COUNT_BEFORE_DOT = 4;
    while (i < count)
    {
        if (result.at(i) == L'.') break;
        i++;
    }
 
    if ( (count - i) > size_upon_point)
    {
        result.resize(i+size_upon_point);
    }
 
    return result;
}
 
template <typename T>
inline std::wstring ToWString(const T &value, const int &size_upon_point)
{
    std::wstring result = boost::lexical_cast<std::wstring>(value);
    int count = result.length();
    int i = 0;
    int COUNT_BEFORE_DOT = 4;
    while (i < count)
    {
        if (result.at(i) == L'.') break;
        i++;
    }
 
    if ( (count - i) > size_upon_point)
    {
        result.resize(i+size_upon_point);
    }
 
    return result;
}
 
inline double Round(double value,int count)
{
    double degree = pow(10.0,count);
    value *= degree;
    double tail = value - static_cast<int>(value);
    if ( tail >= 0.5 )
        tail = 1;
    else
        tail = 0;
    value = static_cast<int>(value+tail);
    value /= degree;
 
    return value;
}
Линкуется и создается без ошибок:
Кликните здесь для просмотра всего текста

1>------ Rebuild All started: Project: converter, Configuration: Release Win32 ------
1>Deleting intermediate and output files for project 'converter', configuration 'Release|Win32'
1>Compiling...
1>converter.cpp
1>Creating library...
1>Build log was saved at "file://c:\Users\vbloodv\Documents\Visual Studio 2008\Projects\converter\Release\BuildLog.htm"
1>converter - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========


А вот при подключении и непосредственном использовании получаю ошибку линковки:
Кликните здесь для просмотра всего текста

1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>Linking...
1>main.obj : error LNK2019: unresolved external symbol "double __cdecl Round(double,int)" (?Round@@YANNH@Z) referenced in function _main
1>C:\Users\vbloodv\Documents\Visual Studio 2008\Projects\Test\Debug\Test.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Users\vbloodv\Documents\Visual Studio 2008\Projects\Test\Debug\BuildLog.htm"
1>Test - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
C++
1
2
3
4
5
6
7
8
9
#include <string>
#include <iostream>
#include "converter.h"
int main()
{
    double ss = Round(124.124,2);
    std::cout << ss << std::endl;
    return 0;
}
1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>Linking...
1>main.obj : error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl ToString<int>(int const &)" (??$ToString@H@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABH@Z) referenced in function _main
1>C:\Users\vbloodv\Documents\Visual Studio 2008\Projects\Test\Debug\Test.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Users\vbloodv\Documents\Visual Studio 2008\Projects\Test\Debug\BuildLog.htm"
1>Test - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped =========
C++
1
2
3
4
5
6
7
8
9
#include <string>
#include <iostream>
#include "converter.h"
int main()
{
    std::string ss = ToString(12);
    std::cout << ss.c_str() << std::endl;
    return 0;
}
правда заголовочный файл я немного изменил:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
 
                   inline std::string  ToString(const bool &value);
template <class T> inline std::string  ToString(const T &value);
template <class T> inline std::string  ToString(const T &value, const int &size_upon_point);
                   inline std::wstring ToWString(const bool &value);
template <class T> inline std::wstring ToWString(const T &value);
template <class T> inline std::wstring ToWString(const T &value, const int &size_upon_point);
 
inline int    ToInt  (const std::string & str);
inline float  ToFloat(const std::string & str);
inline double Round  (double value,int count);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
01.10.2013, 01:59     Не получается скомпилировать и использовать файл .lib #2
Зачем функции объявлены как inline ? Как это можно совместить с тем, что они должны быть включены в библиотеку lib ?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.10.2013, 04:13     Не получается скомпилировать и использовать файл .lib #3
шаблоны нельзя экспрортировать из бинарников. шаблоны header-only
Tulosba
01.10.2013, 08:17
  #4

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
шаблоны нельзя экспрортировать из бинарников. шаблоны header-only
Да. Это Вам не то что .Net'овские дженерики.

vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.10.2013, 11:05  [ТС]     Не получается скомпилировать и использовать файл .lib #5
Цитата Сообщение от palva Посмотреть сообщение
Зачем функции объявлены как inline ? Как это можно совместить с тем, что они должны быть включены в библиотеку lib ?
Цитата Сообщение от Jupiter Посмотреть сообщение
шаблоны нельзя экспрортировать из бинарников. шаблоны header-only
По итогу:
1. убрать inline т.к. вставка происходит непосредственно в lib и глупо пытаться вставить по месту кода
2. использовать только файл заголовка и там же описать тело функций (или описать там тип шаблона, а тело по прежнему можно размещать в cpp) ?
header:
C++
1
2
template <class T>
void Foo(T id);
cpp:
C++
1
2
3
4
void Foo(T id)
{
    T = T+T;
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.10.2013, 12:31     Не получается скомпилировать и использовать файл .lib #6
Вся шаблонная реализация должна быть в заголовочном файле.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.10.2013, 12:57  [ТС]     Не получается скомпилировать и использовать файл .lib #7
Цитата Сообщение от castaway Посмотреть сообщение
Вся шаблонная реализация должна быть в заголовочном файле.
Может ли тогда проект для моей либы состоять из одного заголовочного файла?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.10.2013, 14:06     Не получается скомпилировать и использовать файл .lib #8
Цитата Сообщение от vbloodv Посмотреть сообщение
Может ли тогда проект для моей либы состоять из одного заголовочного файла?
может
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
01.10.2013, 14:14     Не получается скомпилировать и использовать файл .lib #9
и файл cpp с одной строчкой #include.
По расширению cpp компилятор должен понять, что язык c++.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.10.2013, 14:30  [ТС]     Не получается скомпилировать и использовать файл .lib #10
Цитата Сообщение от palva Посмотреть сообщение
и файл cpp с одной строчкой #include.
По расширению cpp компилятор должен понять, что язык c++.
Если компилятор визуал студии и выбран язык c++, то можно не создавать или как в boost'е поставить расширение .hpp ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2013, 08:39     Не получается скомпилировать и использовать файл .lib
Еще ссылки по теме:

C++ Не получается скомпилировать приложение в codeblock
C++ Не создается lib файл
Не создается файл .lib C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
02.10.2013, 08:39     Не получается скомпилировать и использовать файл .lib #11
Напиши весь класс в файле .h и подключай его через #include туда, где он нужен.
Yandex
Объявления
02.10.2013, 08:39     Не получается скомпилировать и использовать файл .lib
Ответ Создать тему
Опции темы

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