簡體   English   中英

我在做什么錯?,用C ++鏈接

[英]What am I doing wrong?, linking in C++

我正在嘗試編寫一個簡單的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 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 = "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

您在Base64Encode的實現中缺少const ,它聲明為:

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

但實現為

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

編譯器認為您已經重載了該函數(對於const和非const向量),並認為缺少const版本的實現。

您的標頭聲明Base64Encode接受const std::vector<byte> &array而源文件聲明它接受std::vector<byte> &array -注意缺少的const限定符。

因此,盡管base64.cpp正確編譯,但它不會鏈接到標頭中的聲明,而標頭是main.cpp知道的唯一原型。 鏈接器運行時, main正在使用const限定符查找簽名,但找不到它。

Base64Encode的參數在標頭中聲明為const ,但在.cpp文件中聲明為非const。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM