2010-04-18 31 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:Windows 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

检查您发布的代码片段,您应该收到编译错误,而不是链接错误。 – 2010-04-18 14:18:03

回答

4

你缺少const在执行Base64Encode时,声明为:

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

但实现

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

编译器认为你已经超负荷功能(const和non-const的载体)和认为的const版本的执行缺少。

+0

的确如此,谢谢;) – Facon 2010-04-18 14:29:49

2

您的标题声明Base64Encode接受类型const std::vector<byte> &array,而您的源文件声明它接受类型std::vector<byte> &array - 注意缺少的const限定符。

因此,虽然base64.cpp编译正确,但它不会链接到标头中的声明,这是main.cpp知道的唯一原型。链接器运行时,main正在寻找const限定符的签名,但无法找到。

1

Base64Encode的参数在标头中声明为const,但在.cpp文件中声明为非常量。