我做错了什么?用C ++连接

时间:2010-04-18 14:13:13

标签: c++ linker mingw base64

我正在尝试编写一个简单的base64编码器/解码器(以测试我的编程技巧)。

我可以编译它,但它没有链接,我有这条消息错误:

  

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

     

main.o:main.cpp :(。text + 0x24a):未定义引用`Base64Encode(std :: vector> const&)'

     

collect2:ld返回1退出状态

编译器&链接器:Mingw32 3.4.5 所以: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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}

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

3 个答案:

答案 0 :(得分:4)

您在const的实施中遗漏了Base64Encode,它被声明为:

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

但实施为

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

编译器认为你已经重载了函数(对于const和非const向量),并认为缺少const版本的实现。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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