2012-07-21 10 views
7

Używam crypto ++ w c ​​++ linux. Oto mój prosty kod:Niezdefiniowane odwołanie do CryptoPP :: AlignedAllocate (unsigned int)

#include <iostream> 
#include <fstream> 
#include <string.h> 

#include "crypto++/cryptlib.h" 
#include "crypto++/modes.h" 
#include "crypto++/filters.h" 
#include "crypto++/aes.h" 
#include "crypto++/osrng.h" 
#include "crypto++/strciphr.h" 

using namespace std; 
using namespace CryptoPP; 

ifstream::pos_type size; 
char * memblock; 
int length; 
char * _iv[AES::BLOCKSIZE]; 
char * keys[AES::MAX_KEYLENGTH]; 


void encriptCTR(byte * outbyte, const byte * inbyte, const byte * key, const byte * iv); 

void encriptCTR(byte * outbyte, const byte * inbyte, const byte * key, const byte * iv) 
{ 
    size_t inbyte_len = strlen((const char *)inbyte); 
    CTR_Mode<AES>::Encryption ctr_encription(key, strlen((const char*)key), iv); 
    ctr_encription.ProcessData(outbyte, inbyte, inbyte_len); 
} 

int main() 
{ 
    ifstream file; 
    file.open("testaja", ios::binary); 
    if (file.is_open()) 
    { 
     file.seekg (0, ios::end); 
     length = file.tellg(); 
     memblock = new char [length]; 
     file.seekg (0, ios::beg); 
     file.read (memblock, length); 


     if (!file) 
     { 
      int a; 
      a = (int)file.gcount(); 
      file.clear(); 
     } 
     else 
     { 
      file.close(); 

      for (int i = 0; i < length; ++i) 
      { 
       cout << hex << (int)memblock[i] << " "; 
      } 

     } 
    } 
} 

Podczas uruchamiania go jakiś błąd:

undefined reference to `CryptoPP::AlignedAllocate(unsigned int)' 
undefined reference to `CryptoPP::UnalignedAllocate(unsigned int)' 
undefined reference to `CryptoPP::AlignedDeallocate(unsigned int)' 
undefined reference to `CryptoPP::UnalignedDeallocate(unsigned int)' 

Następnie użyłem komendy

gcc -o test test.cpp -L/usr/lib/crypto++ -lcrypto++ 

ale błąd ten nadal istnieje:

undefined reference to `CryptoPP::AlignedAllocate(unsigned int)' 
undefined reference to `CryptoPP::UnalignedAllocate(unsigned int)' 
undefined reference to `CryptoPP::AlignedDeallocate(unsigned int)' 
undefined reference to `CryptoPP::UnalignedDeallocate(unsigned int)' 

Jak mogę naprawić ten błąd? Czy jest coś nie tak z moim kodem?

ja instalacji crypto ++ za pomocą synaps menedżera pakietów dla tego pakietu..

libcrypto++-utils 
libcrypto++8 
libcrypto++8-dbg 
libcrypto++-dev 
libcrypto++-doc 

i libcrypto ++ ai libcrypto ++ więc można znaleźć w/usr/lib/

z góry dzięki.

+0

Próbowałem use g ++ skompilować, ale ci, błąd nadal. jaki kod C++ powinienem połączyć? dzięki. – user1533464

+0

Wierzę, że AlignedAllocate (unsigned int) używane w crypto ++/secblock.h, które zawierają crypto ++/misc.h gdzie AlignedAllocate (unsigned int) jest zadeklarowane, ale jakoś nie znaleziono implementacji AlignedAllocate (unsigned int) i wystąpił ten błąd. co powinienem zrobić? – user1533464

+0

Próbowałem włączyć do mojego programu crypto ++/misc.h, ale błąd nadal był oszałamiający. – user1533464

Odpowiedz

5

Polecenie to wygląda źle:

gcc -o test test.cpp -L/usr/lib/crypto++ -lcrypto++ 

Jeśli (jak mówisz) libs są w /usr/lib wtedy nie powinno się mówić -L/usr/lib/crypto++

myślę pakiet libcrypto++8 instaluje swoje bibliotekami w -L/usr/lib/crypto++ i prawdopodobnie nie są kompatybilne i nie dostarczają niezdefiniowanych symboli, których potrzebuje twój program.

Należy skompilować prostu:

gcc -o test test.cpp -lcrypto++ 

(Nie ma potrzeby mówić -L/usr/lib jak to domyślna lokalizacja dla bibliotek i tak)

+0

dzięki, Jonathan. to działa. – user1533464

3

go rozwiązać! zmienić moje polecenie:

g++ -o test test.cpp -L/usr/lib/crypto++ -lcrypto++ 

do tego polecenia:

g++ -o test test.cpp -L/usr/lib/ -lcryptopp -lpthread 

dodam -lpthread bo po użyłem tego polecenia:

g++ -o test test.cpp -L/usr/lib/ -lcryptopp 

otrzymuję te błędy:

./libcryptopp.so: undefined reference to `pthread_getspecific' 
./libcryptopp.so: undefined reference to `pthread_key_delete' 
./libcryptopp.so: undefined reference to `pthread_key_create' 
./libcryptopp.so: undefined reference to `pthread_setspecific' 

źle zrozumiałem o -L/usr/lib/crypto ++ arg, myślałem, że kompilator wyszuka crypto ++ w/usr/lib/dir, okazało się, że kompilator będzie szukał crypto ++ w -L/usr/lib/crypto ++ dir, podczas gdy pakiet zainstalowany w -L/usr/lib/dir.

dzięki {@} joniowi na powitanie.

0

Mam również ten problem. Twój kompilator musi powiązać pliki biblioteki z twoim programem, dlatego, że nie może znaleźć żadnej implementacji twojego procesu dekloryzacji!

Nadal nie mogę rozwiązać mojego problemu. ale masz inny sposób! można zamiast tego .cpp oryginalne pliki z plikami bibliotecznymi.

można pobrać Cryptopp pierwotnie z poniższego linku:

https://www.cryptopp.com/cryptopp563.zip