2010-04-18 8 views
2

프로그래밍 기술을 테스트하기 위해 간단한 base64 인코더/디코더를 코딩하려고합니다.내가 뭘 잘못하고 있니?, C++로 링크

내가 컴파일 할 수 있지만,이 연결되지 않습니다, 나는이 메시지 오류했습니다 :

C:\Documents and Settings\Facon\Escritorio>g++ base64.o main.o -o prueba.exe

main.o:main.cpp:(.text+0x24a): undefined reference to `Base64Encode(std::vector > const&)'

collect2: ld returned 1 exit status

컴파일러를 & 링커 : Mingw32 3.4.5 는 SO : 윈도우 XP

이것은 내 소스 코드 :

base64.h :

#ifndef BASE64_H 
#define BASE64_H 

#include <iostream> 
#include <vector> 

typedef unsigned char byte; 

std::string Base64Encode(const std::vector<byte> &array); 
std::vector<byte> Base64Decode(const std::string &array); 

#endif 

base64.cpp :

#include "base64.h" 

std::string Base64Encode(std::vector<byte> &array) 
{ 
const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 
const unsigned int size = array.size(); 
std::string output; 

for (unsigned int i = 0; (i < size); i++) 
{ 
    if ((size - i) > 3) 
    { 
    output.push_back(static_cast<char>(base64_table[array[i] >> 2])); 
    output.push_back(static_cast<char>(base64_table[((array[i++] & 0x03) << 4) | ((array[i] & 0xF0) >> 4)])); 
    output.push_back(static_cast<char>(base64_table[((array[i++] & 0x0F) << 2) | ((array[i] & 0xC0) >> 4)])); 
    output.push_back(static_cast<char>(base64_table[array[i] & 0x3F])); 
    } 
    else if ((size - i) == 3) 
    { 
    output.push_back(static_cast<char>(base64_table[array[i] >> 2])); 
    output.push_back(static_cast<char>(base64_table[((array[i++] & 0x03) << 4) | ((array[i] & 0xF0) >> 4)])); 
    output.push_back(static_cast<char>(base64_table[(array[i] & 0x0F) << 2])); 
    output.push_back(static_cast<char>('=')); 
    } 
    else if ((size - i) == 2) 
    { 
    output.push_back(static_cast<char>(base64_table[array[i] >> 2])); 
    output.push_back(static_cast<char>(base64_table[(array[i] & 0x03) << 4])); 
    output.push_back('='); 
    output.push_back('='); 
    } 
} 

return output; 
} 

std::vector<byte> Base64Decode(const std::string &array) // TODO 
{ 
const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 
} 

MAIN.CPP :

#include <iostream> 
#include <vector> 
#include "base64.h" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
const char* prueba = "sure."; 
vector<byte> texto; 
string codificado; 

for (unsigned int i = 0; (prueba[i] != 0); i++) 
{ 
    texto.push_back(prueba[i]); 
} 

codificado = Base64Encode(texto); 

cout << codificado; 

return 0; 
} 

PD : P

+0

게시 된 코드 스 니펫을 확인하면 링크 오류가 아닌 컴파일 오류가 발생해야합니다. –

답변

4

당신은 const을 놓치고 : 영어의 나의 잘못된 지식에 대한 죄송합니다 Base64Encode의 구현에서 다음과 같이 선언됩니다.

컴파일러는 (CONST와 const가 아닌 벡터에 대한) 기능을 오버로드 한 생각과 생각
std::string Base64Encode(const std::vector<byte> &array); 

그러나 구현

std::string Base64Encode(std::vector<byte> &array) { ... } 

로 CONST 버전의 구현이 없습니다.

+0

사실입니다, 감사합니다;) – Facon

2

소스 파일에서 std::vector<byte> &array 유형을 허용한다고 선언하는 동안 헤더에서 Base64Encode가 const std::vector<byte> &array 유형을 허용한다고 선언하면 누락 된 const 한정자에 유의하십시오.

따라서 base64.cpp은 올바르게 컴파일되지만 헤더의 선언에 연결되지 않습니다. 이는 main.cpp이 알고있는 유일한 프로토 타입입니다. 링커가 실행되면 mainconst 한정자로 서명을 찾고 있지만 찾을 수 없습니다.

1

의 인수는 헤더에 const으로 선언되지만 .cpp 파일에서는 const가 아닌 것으로 선언됩니다.

관련 문제