在 QT 项目中使用 Crypto++ 静态库

2024-01-05

我已经在我的系统上静态构建了 cryptopp,它也通过了所有测试。这些是我在测试期间收到的警告

WARNING: CRYPTOPP_NO_UNALIGNED_DATA_ACCESS is not defined in config.h.
WARNING: CRYPTOPP_INIT_PRIORITY is not defined in config.h.
WARNING: CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562 is defined in config.h.
WARNING: You should make these changes in config.h, and not CXXFLAGS.
WARNING: You can 'mv config.recommend config.h', but it breaks versioning.
WARNING: See http://cryptopp.com/wiki/config.h for more details.

我现在将其链接到我的 QT 项目文件中

TEMPLATE = app

LIBS += -L/usr/lib/libcryptopp.a
#LIBS += -lcryptopp

CONFIG += console c++11
CONFIG += staticlib

SOURCES += main.cpp \
hashdata.cpp

HEADERS += \
hashdata.hpp

但是当我编译这个时,我得到了所有未定义的错误。

hashdata.o: In function `hashdata::hashfunction(std::string)':
hashdata.cpp:(.text+0x1fb): undefined reference to `CryptoPP::Algorithm::Algorithm(bool)'
hashdata.cpp:(.text+0x270): undefined reference to `CryptoPP::SHA512::InitState(unsigned long long*)'
hashdata.cpp:(.text+0x29a): undefined reference to `CryptoPP::Algorithm::Algorithm(bool)'
hashdata.cpp:(.text+0x2a1): undefined reference to `vtable for CryptoPP::StringSinkTemplate<std::string>'
hashdata.cpp:(.text+0x30b): undefined reference to `CryptoPP::Filter::Filter(CryptoPP::BufferedTransformation*)'
hashdata.cpp:(.text+0x312): undefined reference to `vtable for CryptoPP::Grouper'
hashdata.cpp:(.text+0x35e): undefined reference to `CryptoPP::Filter::Detach(CryptoPP::BufferedTransformation*)'
hashdata.cpp:(.text+0x375): undefined reference to `CryptoPP::Filter::Filter(CryptoPP::BufferedTransformation*)'
hashdata.cpp:(.text+0x37c): undefined reference to `vtable for CryptoPP::BaseN_Encoder'
hashdata.cpp:(.text+0x3d3): undefined reference to `CryptoPP::Filter::Detach(CryptoPP::BufferedTransformation*)'
hashdata.cpp:(.text+0x3e5): undefined reference to `CryptoPP::ProxyFilter::ProxyFilter(CryptoPP::BufferedTransformation*, unsigned long, unsigned long, CryptoPP::BufferedTransformation*)'
hashdata.cpp:(.text+0x3ec): undefined reference to `vtable for CryptoPP::HexEncoder'
hashdata.cpp:(.text+0x452): undefined reference to `vtable for CryptoPP::AlgorithmParametersTemplate<int>'
hashdata.cpp:(.text+0x4af): undefined reference to `vtable for CryptoPP::AlgorithmParametersTemplate<CryptoPP::ConstByteArrayParameter>'
...

之前在google上搜索的时候也看到过类似的问题,但是解决方案并不明确。可能是因为 C++11 标志吗?


我已经在我的系统上静态构建了 cryptopp,它也通过了所有测试。 这些是我在测试期间收到的警告

警告:config.h 中未定义 CRYPTOPP_NO_UNALIGNED_DATA_ACCESS。 警告:config.h 中未定义 CRYPTOPP_INIT_PRIORITY。警告: CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562 在 config.h 中定义。 警告:您应该在 config.h 中进行这些更改,而不是在 CXXFLAGS 中。 警告:您可以“mv config.recommend config.h”,但它会损坏 版本控制。警告:参见http://cryptopp.com/wiki/config.h http://cryptopp.com/wiki/config.h了解更多 细节。

我可以对此警告发表评论。您应该执行它所说的步骤:

mv config.recommend config.h

config.recommend通过完全避免已知的未定义行为,该库是一个更好的配置不能被删除而不破坏版本控制。由于您似乎没有版本控制问题(例如 Fedora 或 Debian),因此您可以执行移动。


我现在将其链接到我的 QT 项目文件中

TEMPLATE = app

LIBS += -L/usr/lib/libcryptopp.a
#LIBS += -lcryptopp

CONFIG += console c++11
...

当您构建 Crypto++ 时,您应该为库和应用程序使用相同的编译器和标志。我建议如下。

Crypto++:

# Be sure to 'mv config.recommend config.h'
export CXXFAGS="-DNDEBUG -g2 -O3 -std=c++11"
make static dynamic test

Qt App

# main.pro file
QMAKE_CXXFLAGS += -DNDEBUG -g2 -O3

另请参阅GNUmake 文件 |建设图书馆 http://www.cryptopp.com/wiki/GNUmakefile#Building_the_Library在 Crypto++ wiki 上。


hashdata.o: In function `hashdata::hashfunction(std::string)':
hashdata.cpp:(.text+0x1fb): undefined reference to `CryptoPP::Algorithm::Algorithm(bool)'
hashdata.cpp:(.text+0x270): undefined reference to `CryptoPP::SHA512::InitState(unsigned long long*)'
...

这些来自源(*.cpp)文件。我猜测(纯粹是猜测)两个问题之一:

  • C++03 与 C++11 导致符号丢失
  • QT Creator 未使用libcryptopp.a

Use nm检查符号。类似于以下内容(“T”告诉您其定义并在文本部分中):

$ nm libcryptopp.a 2>/dev/null | c++filt | \
     grep 'Algorithm::Algorithm(bool)' | grep ' T '
0000000000000060 T CryptoPP::Algorithm::Algorithm(bool)
0000000000000070 T CryptoPP::Algorithm::Algorithm(bool)

如果 QT Creator 存在符号未找到 Crypto++ 库,则查看类似内容将外部库添加到 Qt Creator 项目中 https://stackoverflow.com/q/718447.


来自评论:

-lcryptopp有效,但我不知道为什么-L/usr/lib/libcryptopp.a没有。 ...因为如果一个人同时拥有静态库和动态库,我仍然不知道如何强制链接静态库。

一个档案,比如libcryptopp.a,是目标文件的集合。您将其添加到OBJECTS, not LIBS, 那么你想要类似的东西 https://stackoverflow.com/questions/20874587/adding-object-o-files-to-qtcreator-project:

# main.pro file
OBJECTS += /usr/lib/libcryptopp.a

You use -L指定链接器的库路径。没有多大意义-L/usr/lib/libcryptopp.a因为它用于路径。


额外注意的是,当静态和动态库都存在时,它会自动链接动态库。你知道如何强制静态链接吗?

在 Linux 上,您可以通过以下任一方式强制静态链接:(1)-Bstatic -lcryptopp;或 (2) 直接指定/usr/lib/libcryptopp.a。加密++测试程序采用方法(2) http://www.cryptopp.com/wiki/GNUmakefile#Creating_Programs:

g++ main.cpp /usr/lib/libcryptopp.a -o main.exe

在 OS X 上,链接器始终链接到动态对象。它甚至在 iOS 上也是如此,通常不允许用户空间加载动态对象。为了避免动态链接,(1) 移动或重命名*.dylib;或 (2) 直接指定/usr/lib/libcryptopp.a。加密++测试程序采用方法(2) http://www.cryptopp.com/wiki/GNUmakefile#Creating_Programs:

g++ main.cpp /usr/lib/libcryptopp.a -o main.exe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 QT 项目中使用 Crypto++ 静态库 的相关文章

  • Xamarin 测试记录器选项有错误。无法记录自动化测试

    选项 gt Xamarin gt Xamarin Test Recorder 中的所有设置都有错误 我的桌面上安装了 Visual Studio 2015 企业版 以及 Xamarin 和 Xamarin Test Recorder 插件
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3
  • 哪个更快?按引用传递与按值传递 C++

    我认为按引用传递应该比按值传递更快 因为计算机不复制数据 它只是指向数据的地址 但是 请考虑以下 C 代码 include
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 如何编写完全可移植的 4 字节字符常量的编译时初始化

    遗留 代码大致如下所示 define MAKEID a b c d UInt32 a lt lt 24 UInt32 b lt lt 16 UInt32 c lt lt 8 UInt32 d define ID FORM MAKEID F
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int
  • Cordova 上的 ClearCookiesAsync()

    我正在尝试使用 wp8 cordova 中的插件来清除 WebBrowser cookie 我已经让它与 JavaScript 进行通信 并且我的 c 文件中有类似这样的内容 using WPCordovaClassLib Cordova
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair

随机推荐

  • java.io.StreamCorruptedException:无效的流标头

    我正在编写一个套接字客户端 其中我将数据发送到服务器 使用 getOutputStream 下面是我的代码 this wr this socket getOutputStream wr write hexStringToByteArray
  • 在连续的值运行中创建计数器

    我希望在每次运行的相等值中创建一个连续的数字 就像出现的计数器一样 一旦当前行中的值与前一行不同 它就会重新启动 请在下面找到输入和预期输出的示例 dataset lt data frame input c a b b a a c a a
  • 获取 Response.output 大小? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的代码现在是这样的 var xmlSerializer new XmlSerializer typeof DataSet xmlSe
  • 列表的 Add 和 Append 方法之间的区别?

    之间有区别吗 Append 和 Add C 中的列表方法 我尝试在谷歌和网站上搜索 但令我惊讶的是没有人问这个问题 我询问的原因是想知道这两种方法中的一种是否对性能要求较低 我一直交替使用这两种方法 并且我没有看到它们的功能有任何差异 因为
  • 如何在 Oracle PL/SQL 过程的开始部分之后声明游标

    我是 Oracle PL SQL 新手 我尝试编写一个过程 首先从表中的列获取数据并分配给变量 然后 对于结果中的每一行 值 我执行另一个查询并循环该新查询的结果 并执行各种插入和更新 之后我将返回到外循环并继续序列 我的尝试如下 CREA
  • Javascript - 将数字前导零转换为其他数字。不明白为什么会发生这种情况?

    某个数字的前导零将数字转换为某种未知的数字格式 例如 017正在转换为15 037正在转换为31 还发现末尾有 8 0r 9 的数字保持不变 例如 018 is 18 038 is 38 o59 is 59 我发现的另一件事是 对于接下来的
  • Flink 上运行 Beam pipeline 时出现与内存段相关的 EOFException

    我正在尝试在我们的测试集群上的 Flink 上运行 Apache Beam 管道 它一直失败EOFException at org apache flink runtime io disk SimpleCollectingOutputVie
  • CosmosDB Mongodb 查询速度慢

    我正在使用 MongoDB api 访问 Azure 上的 CosmosDb 我收集了几千份文件 它们的形状如下 id ObjectId 5b4f574ac2100c890805a7d8 id 12 name Spotted Owl ove
  • 错误:找不到 vcvarsall.bat

    我尝试安装Python包dulwich https pypi python org pypi dulwich pip install dulwich 但我收到一条神秘的错误消息 error Unable to find vcvarsall
  • Jquery Serialize 仅适用于 IE

    有了这个 我列出了我的代码 它在所有浏览器中都可以正常工作 但在 IE 中却不行 我在堆栈溢出中搜索了解决方案 但仍然无法修复 请有人帮助我吗 this serialize 在 IE 中返回空 Form UserTripSearch liv
  • 如何在主线程中获取异步结果

    我正在 Windows Phone 7 应用程序上制作登录页面 当异步线程上的服务器返回登录错误消息时 我想在登录页面上获取登录错误状态代码 所以我的问题是 在下面的代码示例中 请告诉我如何在 Main 方法中获取 响应字符串 字符串 ht
  • 从 C# 应用程序中的配置文件检索值不起作用

    当我尝试使用配置文件时遇到问题 我在这里和其他地方读过一些帖子 但工作上的问题却解决不了 在我的问题中 我添加了配置
  • 元素矩阵乘法:R 与 Rcpp(如何加速此代码?)

    我是新来的C 编程 使用Rcpp无缝集成到R 并且我希望得到一些有关如何加快某些计算速度的建议 考虑以下示例 testmat lt matrix 1 9 nrow 3 testvec lt 1 3 testmat testvec 1 2 3
  • CryptographicException:密钥在指定状态下使用无效

    我是 C 新手 我不明白为什么它会产生问题 CspParameters cspParams new CspParameters 24 cspParams KeyContainerName XML DISG RSA KEY RSACrypto
  • 出现错误:连接 ECONNREFUSED 127.0.0.1:3306

    我是 Node js 的初学者 正在学习有关如何为 Android 设置 Node js 服务器的教程 当我执行这个命令时 nodemon app js我收到这个错误 nodemon 1 19 0 nodemon to restart at
  • 相当于 Clojure 函数的 Java toString()

    我正在使用一些 Java 代码调用toString 在我的 Clojure 函数对象上 它返回类似的内容
  • 为什么在 Weblogic 集群中使用单播与组播

    从文档中并不清楚为什么应该在 WebLogic 集群中使用单播而不是多播 有人有使用这两者的经验以及迁移到 Unicast 的好处吗 单播和组播的主要区别如下 Unicast 假设集群中有三台服务器 MS 1 MS 2 MS 3 如果它们必
  • 如何跟踪 Node.js 中的(更改的)日志文件

    好吧 这似乎是一个简单的问题 但我无法从这里找到答案 因此我将其发布 希望有人可能遇到类似的问题 我需要监视指向 Web 服务器文件的符号链接 var log lighttpd error log更具体地说 感谢莱纳斯 G 蒂尔 https
  • WebElement.getCssValue 和 WebElement.getAttribute 用法

    任何人都可以帮助我了解如何使用这两个函数来获取任何 CSS 属性的值 如果有一个特定的 img 标签如下 img title Title alt myTitle src A B C xyz png driver getElement By
  • 在 QT 项目中使用 Crypto++ 静态库

    我已经在我的系统上静态构建了 cryptopp 它也通过了所有测试 这些是我在测试期间收到的警告 WARNING CRYPTOPP NO UNALIGNED DATA ACCESS is not defined in config h WA