Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake引发异常,因为CryptoPP中的引用未定义_C++_Cmake_Linker_Crypto++ - Fatal编程技术网

C++ CMake引发异常,因为CryptoPP中的引用未定义

C++ CMake引发异常,因为CryptoPP中的引用未定义,c++,cmake,linker,crypto++,C++,Cmake,Linker,Crypto++,我得到这个错误: CMakeFiles/Athena.dir/Startup/main.cpp.o: In function `CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, CryptoPP::Rijndael::Enc>::ClonableImpl()': /home/dev/workspace/Athena/lib/

我得到这个错误:

CMakeFiles/Athena.dir/Startup/main.cpp.o: In function `CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, CryptoPP::Rijndael::Enc>::ClonableImpl()':
/home/dev/workspace/Athena/lib/cryptopp/simple.h:26: undefined reference to `CryptoPP::Rijndael::Enc::Enc()'
collect2: error: ld returned 1 exit status
CMakeFiles/Athena.dir/build.make:434: recipe for target 'Athena'
以下是我的简历:

#include "modes.h" // For CTR_Mode
#include "filters.h" //For StringSource
#include "aes.h" // For AES
我已经尝试通过find_包、find_库链接cryptopp,甚至还尝试编写脚本手动下载和制作cryptopp。我真的没有主意了,而且我也非常确定这不是我的代码(我从cryptopp wiki粘贴了一个示例)。

尝试

target_link_libraries(Athena SQLiteCpp sqlite3 cryptopp pthread ${CMAKE_DL_LIBS})

我想改变图书馆的顺序可能会有所帮助。使用
${CMAKE_DL_LIBS}
而不是
DL
不是强制性的,但最好使用便携式CMAKE定义。

您的
CMakeLists.txt
看起来不正确。你应该做两件事。首先,您应该复制
GNUmakefile
用于目标的源文件的精确列表。其次,您应该使用
GNUmakefile
使用的相同标志。必须运行项目的makefile或msbuild文件才能获取这些文件

您还应该考虑使用<代码>外部项目>添加< /代码>;不要再试图让Cmake建立这个库了。该库已经提供了一个Makefile和MSBuild文件来在其支持的所有平台上构建库,因此Cmake是多余的,不需要。没有理由让Cmake使用不正确的选项和标志创建构建文件,因为我们已经提供了一个具有正确选项的构建文件。另请参见关于堆栈溢出的说明

在尝试用Crypto++支持Cmake一年之后,我有了很多经验。另请参见Crypto++wiki上的


您需要弄清楚为什么Cmake会破坏
CRYPTOPP\u BOOL\u X86
CRYPTOPP\u BOOL\u X64
和朋友的定义。要做到这一点,您需要查看命令行,但Cmake会对您隐藏该命令行


相关的,我们测试C++17,您应该可以使用该标志。但是,根据经验,这可能会导致问题:
设置(CMAKE\U CXX\U标准17)
。Cmake没有良好的C++支持。我们无法执行简单的
项目(cryptopp、CXX)
。另见



我将研究删除所有构建的构造函数;并在
中设置
m_aliasBlock
,取消选中设置键。这可能有助于解决这个问题。但它只是一个更大的工程问题的创可贴。Cmake造成的更大的工程问题是我们撤销对它的支持的原因。

不幸的是,我得到了同样的例外:(但感谢${Cmake_DL_LIBS}的提示!我们围绕
Rijndael::Enc
构造函数重新编写了代码。Rijndael类中不再存在该构造函数。现在将使用默认的编译器生成的构造函数。您需要从Master中提取最新的源代码。另请参阅。
target_link_libraries(Athena SQLiteCpp sqlite3 cryptopp pthread ${CMAKE_DL_LIBS})
CMakeFiles/Athena.dir/Startup/main.cpp.o: In function `CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, CryptoPP::Rijndael::Enc>::ClonableImpl()':
/home/dev/workspace/Athena/lib/cryptopp/simple.h:26: undefined reference to `CryptoPP::Rijndael::Enc::Enc()'
collect2: error: ld returned 1 exit status
CMakeFiles/Athena.dir/build.make:434: recipe for target 'Athena'
#if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86

static inline bool AliasedWithTable(const byte *begin, const byte *end)
{
    ptrdiff_t s0 = uintptr_t(begin)%4096, s1 = uintptr_t(end)%4096;
    ptrdiff_t t0 = uintptr_t(Te)%4096, t1 = (uintptr_t(Te)+sizeof(Te))%4096;
    if (t1 > t0)
        return (s0 >= t0 && s0 < t1) || (s1 > t0 && s1 <= t1);
    else
        return (s0 < t1 || s1 <= t1) || (s0 >= t0 || s1 > t0);
}

struct Locals
{
    word32 subkeys[4*12], workspace[8];
    const byte *inBlocks, *inXorBlocks, *outXorBlocks;
    byte *outBlocks;
    size_t inIncrement, inXorIncrement, outXorIncrement, outIncrement;
    size_t regSpill, lengthAndCounterFlag, keysBegin;
};

const size_t s_aliasPageSize = 4096;
const size_t s_aliasBlockSize = 256;
const size_t s_sizeToAllocate = s_aliasPageSize + s_aliasBlockSize + sizeof(Locals);

Rijndael::Enc::Enc() : m_aliasBlock(s_sizeToAllocate) { }

#endif  // CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86

#if CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64 || CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64
// Do nothing
Rijndael::Enc::Enc() { }
#endif