【发布时间】:2016-05-07 10:20:00
【问题描述】:
我想在我的 C++ 应用程序中使用密码散列函数 Argon2。但是如果我构建应用程序,我会得到一个错误:
error while loading shared libraries: libargon2.so.0: cannot open shared object file: No such file or directory
到目前为止我做了什么:我将源代码下载到了我的 Qt 项目文件夹(第三方 > Argon2)的子文件夹中。调用make 构建Argon .so 并通过make test 验证一切正常。项目结构如下:
testproject > CMakeLists.txt
testproject > application > test > impl > src > Main.cpp
testproject > thirdparty > Argon2 > include > argon2.h
testproject > thirdparty > Argon2 > libargon2.so
在我的 CMakeLists 中,我添加了 Argon 包含路径并尝试链接到 .so 文件:
find_library(Argon2 NAMES libargon2 PATHS ${CMAKE_SOURCE_DIR}/thirdparty/Argon2)
# Additional include directories
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/thirdparty/Argon2/include
target_link_libraries(${COMPONENT_NAME} ${Argon2})
但是这个简单的测试程序会给我上面提到的错误。
#include "argon2.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define HASHLEN 32
#define SALTLEN 16
#define PWD "password"
int main(){
uint8_t hash1[HASHLEN];
uint8_t salt[SALTLEN];
memset( salt, 0x00, SALTLEN );
uint8_t *pwd = (uint8_t *)strdup(PWD);
uint32_t pwdlen = strlen((char *)pwd);
uint32_t t_cost = 2; // 1-pass computation
uint32_t m_cost = (1<<16); // 64 mebibytes memory usage
uint32_t parallelism = 1; // number of threads and lanes
argon2i_hash_raw(t_cost, m_cost, parallelism, pwd, pwdlen, salt, SALTLEN, hash1, HASHLEN);
}
我对 C++ 和 CMake 还是很陌生,所以我不知道我的程序是否正确(显然不是,因为它不起作用)。
- 是否可以只链接 .so 文件?
- 我是否必须在我的项目中包含 Argon 库的整个目录(就像我尝试过的那样)?
- 告诉我的链接器如何正确找到库的必要步骤是什么?
编辑
This post 似乎与我的相似。但是我不知道 .so 文件是否足够以及如何链接到我的 debian 系统的包管理器未安装的库。
【问题讨论】:
-
我不认为这是重复的。至少我无法通过您提到的问题中的答案来弄清楚如何解决我的问题。
-
嗯,问题帖已更改,不再与我建议的问题重复。现在您链接到库 (
target_link_libraries),而不是“未定义的引用”,您会收到有关无法找到库的错误。此错误是链接错误(您未能创建可执行文件)还是运行错误(您未能运行可执行文件)?看起来像第二种情况,因为这种错误通常在运行可执行文件时出现。 -
是的,这是运行时的错误。但是,我能够将静态库(与 .so 相同的文件夹)与 target_link_libraries 链接起来。但这不是我想要的。
-
可能您的可执行文件缺少 RPATH 调整。请参阅this wiki 关于 RPATH 以及 CMake 如何处理它。您始终可以使用
ldd <binary-file>检查 RPATH 设置的正确性。对于未来:尝试更准确地描述情况。你写I get a error if I build the application,它通常被理解为你在build期间捕获的错误。但实际上这是应用程序 run 期间出现的错误。
标签: c++ qt cmake shared-libraries .so