我正在尝试编写一个简单的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
答案 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文件中声明为非常量。