簡體   English   中英

鏈接時對CryptoPP :: AlignedAllocate的未定義引用

[英]Undefined reference to CryptoPP::AlignedAllocate when linking

我在Windows中編譯cryptopp項目時遇到以下錯誤。

C:\Users\Sajith\AppData\Local\Temp\ccxq8O8x.o:aescbc.cpp:(.text$_ZN8CryptoPP20AllocatorWithCleanupIhLb1EE8allocateEjPKv[
__ZN8CryptoPP20AllocatorWithCleanupIhLb1EE8allocateEjPKv]+0x2e): undefined reference to `CryptoPP::AlignedAllocate(unsig
ned int)'
C:\Users\Sajith\AppData\Local\Temp\ccxq8O8x.o:aescbc.cpp:(.text$_ZN8CryptoPP20AllocatorWithCleanupIhLb1EE10deallocateEPv
j[__ZN8CryptoPP20AllocatorWithCleanupIhLb1EE10deallocateEPvj]+0x28): undefined reference to `CryptoPP::AlignedDeallocate
(void*)'
collect2.exe: error: ld returned 1 exit status


下面是我的編譯命令:

mingw32-g++.exe -o .\aestest2.exe .\aescbc.cpp   -I "C:\cryptopp\Include" -L "C:\cryptopp\Lib" -lcryptopp


我的libcryptopp.a位於C:\\cryptopp\\Lib
我試圖找出AlignedDeallocate的聲明位置,但我沒有聲明。

引發此錯誤的程序部分如下:

try
    {
        cout << "plain text: " << plain << endl;

        CBC_Mode< AES >::Encryption e;
        e.SetKeyWithIV(key, sizeof(key), iv);

        // The StreamTransformationFilter removes
        //  padding as required.
        StringSource s(plain, true, 
            new StreamTransformationFilter(e,
                new StringSink(cipher)
            ) // StreamTransformationFilter
        ); // StringSource

#if 0
        StreamTransformationFilter filter(e);
        filter.Put((const byte*)plain.data(), plain.size());
        filter.MessageEnd();

        const size_t ret = filter.MaxRetrievable();
        cipher.resize(ret);
        filter.Get((byte*)cipher.data(), cipher.size());
#endif
    }
    catch(const CryptoPP::Exception& e)
    {
        cerr << e.what() << endl;
        exit(1);
    }


建議表示贊賞!

AlignedAllocate位於misc.h

$ grep -I AlignedAllocate *
misc.cpp:void * AlignedAllocate(size_t size)
misc.h:CRYPTOPP_DLL void * CRYPTOPP_API AlignedAllocate(size_t size);
secblock.h:                     return (pointer)AlignedAllocate(n*sizeof(T));

和:

$ grep -R AlignedDeallocate *
misc.cpp:void AlignedDeallocate(void *p)
misc.h:CRYPTOPP_DLL void CRYPTOPP_API AlignedDeallocate(void *p);
secblock.h:                     return AlignedDeallocate(p);

但是,他們要注意:

#if CRYPTOPP_BOOL_ALIGN16_ENABLED
CRYPTOPP_DLL void * CRYPTOPP_API AlignedAllocate(size_t size);
CRYPTOPP_DLL void CRYPTOPP_API AlignedDeallocate(void *p);
#endif

CRYPTOPP_BOOL_ALIGN16_ENABLEDconfig.h設置:

#if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE || CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE || defined(CRYPTOPP_X64_MASM_AVAILABLE)
    #define CRYPTOPP_BOOL_ALIGN16_ENABLED 1
#else
    #define CRYPTOPP_BOOL_ALIGN16_ENABLED 0
#endif

在內部選擇Crypto ++之后,您可以考慮將以下內容添加到config.h

#undef CRYPTOPP_BOOL_ALIGN16_ENABLED
#define CRYPTOPP_BOOL_ALIGN16_ENABLED 1

然后,重建庫和您的程序。


可能正在發生的其他事情是:MinGW正在禁用MMX / SSE / SSE2的計算機上構建庫。 也許他們正在使用g++ -mno-sse -mno-sse2 ...

然后,您花了很長時間AlignedAllocate了閃亮的新Intel或AMD,並且基於g ++啟用的功能以及config.h的定義,您的程序需要AlignedAllocateAlignedDeallocate因為您的配置包括MMX / SSE / SSE2 ...

config.h中討論了這種情況 建議在加密+維基。 這就是為什么我們告訴發行版啟用和禁用config.h ,而不是從命令行config.h啟用它的原因。 修改config.h可確保發行版和用戶程序大多使用相同的設置。

如果是這種情況,那么您可以嘗試:

export CXXFLAGS="-DNDEBUG -g2 -O2 -mno-sse -mno-sse2"
mingw32-g++.exe $CXXFLAGS -o .\aestest2.exe .\aescbc.cpp \
  -I "C:\cryptopp\Include" -L "C:\cryptopp\Lib" -lcryptopp

有許多基於MMX / SSE / SSE2的層疊定義。 參見config.h | 程序集在Wiki上定義 由於禁用了MMX / SSE / SSE2,因此您將獲得AES的純軟件實現。 它的性能可能不盡如人意。

我一直在使用MSYS2版本的MinGW64經歷相同的事情

解決方法是在-lcryptopp之前添加-static 希望這對您有用!

編輯 :沒關系,實際上我的第一個答案。 MSYS2的存儲庫中可能有共享庫的損壞版本,但我想您是自己編譯的。

相反,我將提供一種如何使用MinGW編譯Crypto ++的方法。 您將需要Qt的qmake生成一個Makefile而不是使用其中的一個。

首先,打開TESTOBJS並查找TESTOBJS ,從5.6.2開始,它是bench.o bench2.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o dlltest.o 您需要刪除具有相同名稱的.cpps,因此您無需構建a腫的lib。

然后打開cmd.exe( PATH包含MinGW的/ bin和qmake.exe所在的目錄),導航到包含源的目錄並使用以下命令:

erase /f GNUmakefile
qmake -project

它將創建一個具有當前文件夾名稱和擴展名“ .pro”的文件。 用文本編輯器打開它,更改

TEMPLATE = app
TARGET = cryptopp562
INCLUDEPATH += .

TEMPLATE = lib
TARGET = cryptopp
INCLUDEPATH += .
CONFIG -= qt
CONFIG += static
LIBS += -lws2_32
QMAKE_CXXFLAGS_RELEASE += -DNDEBUG

更換每隔OutputDebugStringOutputDebugStringAfipstest.cpp。

現在,您可以鍵入qmake生成一個新的Makefile並使用mingw32-make 會有大量警告,主要是有關未使用的參數的警告。 然而,沒有什么事情足以取消編譯。 libcryptopp.a將位於./release/

問題中的示例可以編譯並通過這種方式編譯的庫運行良好,並通過與Qt捆綁在一起的MinGW 4.9.2和獨立的MingGW-w64 5.2.0進行了測試。

基本思想是從這里開始的 ,我只是對其進行了改進。

如果您在程序中使用Crypto++ ,請注意:

這個解決方案是針對Linux的,如果您執行波紋管命令,您的問題100%解決!!!

如果要鏈接.so文件並最終編譯程序,則必須首先從ubuntu或其他發行版(基於Debian的Linux)中安裝Synaptic工具提供的所有Crypto++庫。

之后,您最多將-lcryptopp或/和-lcrypto++添加到qt創建器中的.pro文件中,如下所示:

LIBS += -lcryptopp
LIBS += -lcrypto++

我有這個問題,但是我的問題解決了...

而且我的代碼沒有任何錯誤

如果需要,請在window中進行測試,然后在Windows的qt創建器中添加兩個頂部語句。

暫無
暫無

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

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