【发布时间】:2017-11-06 23:41:54
【问题描述】:
前段时间我开始在 Visual Studio 2015 中编写我的应用程序,设置所有库依赖项都没有问题。
现在,我决定搬到 CLion。但是,我的应用程序依赖于 cryptopp 库,我需要将其链接到我的 CLion 项目中。
目前,我面临大量 undefined reference 错误
undefined reference to `CryptoPP::Integer::Integer(char const*)'
undefined reference to `CryptoPP::Integer::Integer(char const*)'
undefined reference to `CryptoPP::Integer::Integer(char const*)'
undefined reference to `CryptoPP::DH_Domain<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime, CryptoPP::EnumToType<CryptoPP::CofactorMultiplicationOption, 0> >::AccessGroupParameters()'
undefined reference to `CryptoPP::DH_Domain<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime, CryptoPP::EnumToType<CryptoPP::CofactorMultiplicationOption, 0> >::GetGroupParameters() const'
undefined reference to `CryptoPP::DH_Domain<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime, CryptoPP::EnumToType<CryptoPP::CofactorMultiplicationOption, 0> >::GetGroupParameters() const'
[..]
我确实在我的 CMakeLists 中设置了包含目录:
set(EXTERN_LIBS E:/dev/libs)
include_directories(${EXTERN_LIBS} ${EXTERN_LIBS}/include)
link_directories(${EXTERN_LIBS})
但是,我仍然无法让它工作。
我在我的项目中使用 MinGW。这是设置和版本的预览:
如何在 CLion 中将cryptopp 库正确添加到我的项目中?
【问题讨论】:
-
使用
link_directories(${EXTERN_LIBS}),您只需将目录添加到搜索路径。您实际上并没有告诉 CMake link 与任何库。为此,请使用target_link_libraries命令。 -
@Someprogrammerdude 我已经尝试过了。使用
target_link_libraries(myapp cryptlib.lib)时,我得到mingw32/bin/ld.exe: cannot find -lcryptlib错误。当我指定库的完整路径时,此错误消失了,但undefined reference错误仍然存在。 -
您的
cryptlib.lib是使用 MS VC++ 构建的。您现在正试图将它与使用 GCC (MinGW) 编译的目标文件链接起来。那是行不通的。 GCC 和 VC++ 有不兼容的ABIs,特别是不同的name mangling 协议。因此,MinGW 在您的目标代码中发出的损坏的 C++ 标识符与您的 VC++ 编译库导出的任何标识符都不匹配,并且是未定义的引用。您需要使用 MinGW 从源代码构建cryptopp以制作与 ABI 兼容的库。 -
@MikeKinghan 那我可以使用 Visual Studio 编译器吗?我读过一些关于cryptopp的文章,结果发现它不支持CMake。
-
真的吗?
cryptopp 5.6.5GitHub download 中的CMakeLists.txt在 Windows 10 Pro 上使用 mingw-w64 GCC 7.2.0 构建软件包时没有问题。当然,您可以使用 MS VC++ 构建它
标签: c++ mingw static-libraries clion crypto++