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

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

Восстановить пароль Регистрация
 
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 19:31     Error LNK2019: ссылка на неразрешенный внешний символ #1
умелые люди помогите исправить ошибку, сегодня надо сдать класс, подправил и упростил код 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);
}
Вложения
Тип файла: rar без класса.rar (7.89 Мб, 1 просмотров)
Тип файла: rar класс.rar (4.21 Мб, 3 просмотров)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 19:53     Error LNK2019: ссылка на неразрешенный внешний символ #2
Все необходимые библиотеки(lib) подключены?
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 19:59  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Все необходимые библиотеки(lib) подключены?
да, там все то же что и в проекте без класса, а в классе не пашет, и не знаю где мог допустить ошибку, разве что я в свой хидер внес даные хидера unrar, но изза этого не должно быть ошибки потому что там все паблик, ибо это опен сурс с офсайта...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 20:33     Error LNK2019: ссылка на неразрешенный внешний символ #4
Подключите хадер unrar.h и используйте структуры и функции оттуда, а не создавайте свои структуры.

Проект собирается, если вырезать Ваши дополнения и использовать те определения, которые поставляются вместе с библиотекой:
new_prj.rar
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 20:50  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #5
спасибо большое, все понял, чесно говоря я так и думал что надо подключить h файл а не создавать свой, но не знал что можно подключитьь как
C++
1
2
3
extern "C"{
#include "unrar.h"
}
если я подправлю unrar.h и удалю функции которые мне не нужны, то если что то пойдет не так, буду надеяться на вашу помощь =)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 20:55     Error LNK2019: ссылка на неразрешенный внешний символ #6
но не знал что можно подключитьь как
include просто тупо вставляет текст
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 21:02  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #7
Цитата Сообщение от Croessmah Посмотреть сообщение
include просто тупо вставляет текст
я знаю это, просто не знал что можно внутри екстерна юзать =)
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;
}

TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 21:36  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #9
возникла проблема, я думал что снова что то не так сделал, но потом еще раз скачал ваш архив и проверил,
так вот проект компилируется, но не запускается...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 21:47     Error LNK2019: ссылка на неразрешенный внешний символ #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
//А на куда у нас "смотрят" указатели? В никуда. Память кто выделять будет?
}
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 22:27  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #11
я что то не пойму, нужно их содать переменными а потом ссылатся на их адрес ?? но так не работает....
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 22:30     Error LNK2019: ссылка на неразрешенный внешний символ #12
Как-то так:
C++
1
2
3
4
    inPath=new char [strlen(_inPath)+1];
    outDir=new char [strlen(_outDir)+1];
    strcpy(inPath, _inPath);
    strcpy(outDir, _outDir);
Соответственно, необходимо написать корректный деструктор, конструктор копий и оператор присваивания
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 22:32  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #13
ок, спасибо, сейчас будем пробовать делать...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 22:34     Error LNK2019: ссылка на неразрешенный внешний символ #14
Цитата Сообщение от TheVlad Посмотреть сообщение
я что то не пойму, нужно их содать переменными а потом ссылатся на их адрес ??
В конструкторе память под указатели выделить.
В деструкторе:
C++
1
delete []buffer;
Разве под buffer память в куче выделялась?
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
26.05.2013, 22:59  [ТС]     Error LNK2019: ссылка на неразрешенный внешний символ #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве под buffer память в куче выделялась?
как массив

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

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 23:46     Error LNK2019: ссылка на неразрешенный внешний символ #16
Цитата Сообщение от TheVlad Посмотреть сообщение
как массив
С помощью delete можно освобождать только то, что через new выделялось.

Добавлено через 6 минут
На эту тему: delete[] статической памяти
Yandex
Объявления
26.05.2013, 23:46     Error LNK2019: ссылка на неразрешенный внешний символ
Ответ Создать тему
Опции темы

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