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

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

Войти
Регистрация
Восстановить пароль
 
 
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
#1

Error LNK2019: ссылка на неразрешенный внешний символ - C++

26.05.2013, 19:31. Просмотров 636. Ответов 15
Метки нет (Все метки)

умелые люди помогите исправить ошибку, сегодня надо сдать класс, подправил и упростил код unrar'a после чего нужно было переделать его под класс, что я и сделал, но вылазит след ошибка:
Кликните здесь для просмотра всего текста

1>RAR_Decoder.obj : error LNK2019: ссылка на неразрешенный внешний символ _RAROpenArchiveEx в функции "public: int __thiscall RAR_Decoder::decode(void)" (?decode@RAR_Decoder@@QAEHXZ)
1>RAR_Decoder.obj : error LNK2019: ссылка на неразрешенный внешний символ _RARCloseArchive в функции "public: int __thiscall RAR_Decoder::decode(void)" (?decode@RAR_Decoder@@QAEHXZ)
1>RAR_Decoder.obj : error LNK2019: ссылка на неразрешенный внешний символ _RARReadHeader в функции "public: int __thiscall RAR_Decoder::decode(void)" (?decode@RAR_Decoder@@QAEHXZ)
1>RAR_Decoder.obj : error LNK2019: ссылка на неразрешенный внешний символ _RARProcessFile в функции "public: int __thiscall RAR_Decoder::decode(void)" (?decode@RAR_Decoder@@QAEHXZ)


вот код и проект:

Кликните здесь для просмотра всего текста

мой хидер

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
75
76
77
78
79
#pragma once
#pragma comment (lib, "unrar.lib")
 
#include <string.h>
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <locale.h>
 
 
 
 
#define BUFFER          16384
#define EXTRACT         0
#define RAR_OM_EXTRACT  1
#define RAR_EXTRACT     2
 
 
struct RARheader
{
  char         ArcName[260];
  char         FileName[260];
  unsigned int Flags;
  unsigned int PackSize;
  unsigned int UnpSize;
  unsigned int HostOS;
  unsigned int FileCRC;
  unsigned int FileTime;
  unsigned int UnpVer;
  unsigned int Method;
  unsigned int FileAttr;
  char         *buffer;
  unsigned int bufferSize;
  unsigned int CmtSize;
  unsigned int CmtState;
};
 
 
struct RARfileHeaderEx
{
  char         *ArcName;
  wchar_t      *ArcNameW;
  unsigned int  OpenMode;
  unsigned int  OpenResult;
  char         *buffer;
  unsigned int  bufferSize;
  unsigned int  CmtSize;
  unsigned int  CmtState;
  unsigned int  Flags;
  LPARAM        UserData;
  unsigned int  Reserved[28];
};
   
    
 
 
extern "C" 
{
    HANDLE RAROpenArchiveEx(struct RARfileHeaderEx *ArchiveData);
    int    RARCloseArchive(HANDLE rarFile);
     int    RARReadHeader(HANDLE rarFile,struct RARheader *rarHeader);
     int    RARProcessFile(HANDLE rarFile,int Operation,char *DestPath,char *DestName);
}
 
 
 
class RAR_Decoder
{
public:
    RAR_Decoder(char *_inPath, char *_outDir);
    ~RAR_Decoder(void);
    int decode();
private:
    char *inPath, *outDir;
    HANDLE rarFile;
    char buffer[BUFFER];
    RARheader *rarHeader;
    RARfileHeaderEx *fileHeader;
};
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
#include "RAR_Decoder.h"
 
 
 
RAR_Decoder::RAR_Decoder(char *_inPath, char *_outDir)
{
    strcpy(inPath, _inPath);
    strcpy(outDir, _outDir);
}
 
 
 
RAR_Decoder::~RAR_Decoder(void)
{
    if(buffer)
    delete []buffer;
    delete rarHeader;
    delete fileHeader;
    delete rarFile;
}
 
 
int RAR_Decoder::decode()
{
  memset(&fileHeader,0,sizeof(fileHeader));
  
  fileHeader->ArcName=inPath;
  fileHeader->buffer=buffer;
  fileHeader->bufferSize=sizeof(buffer);
  fileHeader->OpenMode=RAR_OM_EXTRACT;
  fileHeader->UserData=EXTRACT;
  rarFile=RAROpenArchiveEx(fileHeader);
 
  if (fileHeader->OpenResult!=0)
        return -1;
 
  rarHeader->buffer=NULL;
  memset(&fileHeader->Reserved,0,sizeof(fileHeader->Reserved));
 
  while ( !RARReadHeader(rarFile,rarHeader) )
  {
    if ( RARProcessFile(rarFile, RAR_EXTRACT, outDir, NULL) )
        return 1;
  }
  RARCloseArchive(rarFile);
  return 0;
}
main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "RAR_Decoder.h"
#include <iostream>
int main()
{
    RAR_Decoder unRar("1.rar", "1");
 
    if( unRar.decode() )
        std::cout<<"work";
    else
        std::cout<<"Error";
 
    system("pause");
    return 0;
}


p.s. пока не переделал под класс, все отлично работало, вот код и проект
Кликните здесь для просмотра всего текста


unrar.h
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
#ifndef _UNRAR_DLL_
#define _UNRAR_DLL_
 
#pragma pack(1)
 
#define EXTRACT         0
#define RAR_OM_EXTRACT  1
#define RAR_EXTRACT     2
 
 
struct RARHeaderData
{
  char         ArcName[260];
  char         FileName[260];
  unsigned int Flags;
  unsigned int PackSize;
  unsigned int UnpSize;
  unsigned int HostOS;
  unsigned int FileCRC;
  unsigned int FileTime;
  unsigned int UnpVer;
  unsigned int Method;
  unsigned int FileAttr;
  char         *CmtBuf;
  unsigned int CmtBufSize;
  unsigned int CmtSize;
  unsigned int CmtState;
};
 
 
struct RAROpenArchiveDataEx
{
  char         *ArcName;
  wchar_t      *ArcNameW;
  unsigned int  OpenMode;
  unsigned int  OpenResult;
  char         *CmtBuf;
  unsigned int  CmtBufSize;
  unsigned int  CmtSize;
  unsigned int  CmtState;
  unsigned int  Flags;
  LPARAM        UserData;
  unsigned int  Reserved[28];
};
 
 
extern "C"
{
    HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData);
    int    PASCAL RARCloseArchive(HANDLE hArcData);
    int    PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData);
    int    PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName);
}
#pragma pack()
 
#endif
main

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
#define STRICT
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <locale.h>
#include "unrar.h"
#include <iostream>
 
void ExtractArchive(char *ArcName,char *OutDir);
 
 
int main()
{
  setlocale(LC_ALL, NULL);
  
  ExtractArchive("1.rar", "1");
  system("pause");
  return(0);
}
 
 
void ExtractArchive(char *ArcName, char *OutDir)
{
  HANDLE hArcData;
  int RHCode,PFCode;
  char CmtBuf[16384];
  struct RARHeaderData HeaderData;
  struct RAROpenArchiveDataEx OpenArchiveData;
 
  memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
  OpenArchiveData.ArcName=ArcName;
  OpenArchiveData.CmtBuf=CmtBuf;
  OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
  OpenArchiveData.OpenMode=RAR_OM_EXTRACT;
  OpenArchiveData.UserData=EXTRACT;
  hArcData=RAROpenArchiveEx(&OpenArchiveData);
 
  if (OpenArchiveData.OpenResult!=0)
  {
    std::cout<<"OPEN EROR\n";
    system("pause");
    return;
  }
  HeaderData.CmtBuf=NULL;
  memset(&OpenArchiveData.Reserved,0,sizeof(OpenArchiveData.Reserved));
 
  while ((RHCode=RARReadHeader(hArcData,&HeaderData))==0)
  {
      std::cout<<"\nExtracting "<<HeaderData.FileName;
 
    if ( !RARProcessFile(hArcData, RAR_EXTRACT, OutDir,NULL) )
        std::cout<<" OK \n";
    else
        std::cout<<"EROR\n";
  }
  RARCloseArchive(hArcData);
}
0
Вложения
Тип файла: rar без класса.rar (7.89 Мб, 1 просмотров)
Тип файла: rar класс.rar (4.21 Мб, 3 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2013, 19:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Error LNK2019: ссылка на неразрешенный внешний символ (C++):

Error LNK2019: ссылка на неразрешенный внешний символ - C++
Вот код #include &lt;iostream&gt; using namespace std; template &lt;class Type&gt; class Array { private: Type **pa; int ...

Error LNK2019: ссылка на неразрешенный внешний символ - C++
пишу программу типа клавиатурного тренажера,она еще не закончена,но уже возникла проблема основной код #include &quot;klava.h&quot; #include...

Error LNK2019: ссылка на неразрешенный внешний символ - C++
Список ошибок Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ &quot;public: __thiscall Stack&lt;char&gt;::Stack&lt;char&gt;(int)&quot;...

error LNK2019: ссылка на неразрешенный внешний символ - C++
Доброго времени суток. При написании курсового проекта в Microsoft Visual Studio 2010 возникла проблема. Насколько я понял, что-то не так с...

error LNK2019: ссылка на неразрешенный внешний символ... - C++
Подскажите что я не правельно сделал? #include&lt;iostream&gt; using namespace std; #include&lt;iomanip&gt; int f_fact(int); int...

Error LNK2019: ссылка на неразрешенный внешний символ - C++
Ни одной строки с ошибкой. Читал здесь про неё Вот так у меня зарегана: CreateUpDownControl(UDS_SETBUDDYINT, 290, 185, 5, 25,...

15
Croessmah
Эксперт CЭксперт С++
13419 / 7573 / 855
Регистрация: 27.09.2012
Сообщений: 18,643
Записей в блоге: 3
Завершенные тесты: 1
26.05.2013, 19:53 #2
Все необходимые библиотеки(lib) подключены?
1
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 19:59  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Все необходимые библиотеки(lib) подключены?
да, там все то же что и в проекте без класса, а в классе не пашет, и не знаю где мог допустить ошибку, разве что я в свой хидер внес даные хидера unrar, но изза этого не должно быть ошибки потому что там все паблик, ибо это опен сурс с офсайта...
0
Croessmah
Эксперт CЭксперт С++
13419 / 7573 / 855
Регистрация: 27.09.2012
Сообщений: 18,643
Записей в блоге: 3
Завершенные тесты: 1
26.05.2013, 20:33 #4
Подключите хадер unrar.h и используйте структуры и функции оттуда, а не создавайте свои структуры.

Проект собирается, если вырезать Ваши дополнения и использовать те определения, которые поставляются вместе с библиотекой:
new_prj.rar
1
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 20:50  [ТС] #5
спасибо большое, все понял, чесно говоря я так и думал что надо подключить h файл а не создавать свой, но не знал что можно подключитьь как
C++
1
2
3
extern "C"{
#include "unrar.h"
}
если я подправлю unrar.h и удалю функции которые мне не нужны, то если что то пойдет не так, буду надеяться на вашу помощь =)
0
Croessmah
Эксперт CЭксперт С++
13419 / 7573 / 855
Регистрация: 27.09.2012
Сообщений: 18,643
Записей в блоге: 3
Завершенные тесты: 1
26.05.2013, 20:55 #6
но не знал что можно подключитьь как
include просто тупо вставляет текст
0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 21:02  [ТС] #7
Цитата Сообщение от Croessmah Посмотреть сообщение
include просто тупо вставляет текст
я знаю это, просто не знал что можно внутри екстерна юзать =)
0
Croessmah
26.05.2013, 21:06
  #8

Не по теме:

Да хоть так:
1.h

"my string"
main.cpp
C++
1
2
3
4
5
6
#include <iostream>
int main(){
    std::cout<<
    #include "1.h"
    <<std::endl;
}

0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 21:36  [ТС] #9
возникла проблема, я думал что снова что то не так сделал, но потом еще раз скачал ваш архив и проверил,
так вот проект компилируется, но не запускается...
0
Croessmah
Эксперт CЭксперт С++
13419 / 7573 / 855
Регистрация: 27.09.2012
Сообщений: 18,643
Записей в блоге: 3
Завершенные тесты: 1
26.05.2013, 21:47 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
У меня запускается, но вылетает ошибка. вот почему:
C++
1
2
3
4
5
6
class RAR_Decoder
{
//...
    char *inPath, *outDir;//Объявление указателей
//...
};
А вот конструктор класса:
C++
1
2
3
4
5
6
RAR_Decoder::RAR_Decoder(char *_inPath, char *_outDir)
{
    strcpy(inPath, _inPath);//Копируем из _inPath в inPath
    strcpy(outDir, _outDir);//Копируем из _outDir в outDir
//А на куда у нас "смотрят" указатели? В никуда. Память кто выделять будет?
}
0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 22:27  [ТС] #11
я что то не пойму, нужно их содать переменными а потом ссылатся на их адрес ?? но так не работает....
0
Croessmah
Эксперт CЭксперт С++
13419 / 7573 / 855
Регистрация: 27.09.2012
Сообщений: 18,643
Записей в блоге: 3
Завершенные тесты: 1
26.05.2013, 22:30 #12
Как-то так:
C++
1
2
3
4
    inPath=new char [strlen(_inPath)+1];
    outDir=new char [strlen(_outDir)+1];
    strcpy(inPath, _inPath);
    strcpy(outDir, _outDir);
Соответственно, необходимо написать корректный деструктор, конструктор копий и оператор присваивания
1
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 22:32  [ТС] #13
ок, спасибо, сейчас будем пробовать делать...
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 22:34 #14
Цитата Сообщение от TheVlad Посмотреть сообщение
я что то не пойму, нужно их содать переменными а потом ссылатся на их адрес ??
В конструкторе память под указатели выделить.
В деструкторе:
C++
1
delete []buffer;
Разве под buffer память в куче выделялась?
0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 22:59  [ТС] #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве под buffer память в куче выделялась?
как массив

Добавлено через 50 секунд
спасибо всем за помощь, но у меня ничего не получилось сделать, завтра постараюсь доделать, , если доделаю- выложу код и проект, думаю еще понадобиться в будущем кому то, ибо еще на форуме нету этого(или я просто не нашел) =)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 22:59
Привет! Вот еще темы с ответами:

error lnk2019 ссылка на неразрешенный внешний символ - C++
1&gt; Обращение к &quot;Debug\тесткомпилятора2лабыerror LNK2019.unsuccessfulbuild&quot;. 1&gt;ClCompile: 1&gt; Trenirovki.cpp 1&gt; SportsmenManager.cpp...

error LNK2019: ссылка на неразрешенный внешний символ - C++
только-только начал изучать c++.написал программу. компиляция прошла успешно, а при отладке выдаёт ошибку 1&gt;------ Построение начато:...

Error LNK2019: ссылка на неразрешенный внешний символ - C++
Всем доброго времени суток. Помогите пожалуйста разобраться с проблемой. Честно просматривал форму, похожих ошибок много, но решение в...

Error LNK2019: ссылка на неразрешенный внешний символ - C++
Person.obj : error LNK2019: ссылка на неразрешенный внешний символ &quot;public: __thiscall Person::Person(class Person &amp;,char *,char *,char *)&quot;...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
26.05.2013, 22:59
Ответ Создать тему
Опции темы

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