如何在Qt Creator中将Argon2库与cmake链接 我想在我的C++应用程序中使用密码哈希函数。但如果我构建应用程序,则会出现错误: error while loading shared libraries: libargon2.so.0: cannot open shared object file: No such file or directory
到目前为止,我所做的是:我将源代码下载到Qt项目文件夹(thirdparty>Argon2)的一个子文件夹中。调用如何在Qt Creator中将Argon2库与cmake链接 我想在我的C++应用程序中使用密码哈希函数。但如果我构建应用程序,则会出现错误: error while loading shared libraries: libargon2.so.0: cannot open shared object file: No such file or directory,c++,qt,cmake,shared-libraries,.so,C++,Qt,Cmake,Shared Libraries,.so,到目前为止,我所做的是:我将源代码下载到Qt项目文件夹(thirdparty>Argon2)的一个子文件夹中。调用make来制造氩气。然后通过make test验证一切正常。项目结构如下所示: testproject > CMakeLists.txt testproject > application > test > impl > src > Main.cpp testproject > thirdparty > Argon2 > incl
make
来制造氩气。然后通过make test
验证一切正常。项目结构如下所示:
testproject > CMakeLists.txt
testproject > application > test > impl > src > Main.cpp
testproject > thirdparty > Argon2 > include > argon2.h
testproject > thirdparty > Argon2 > libargon2.so
在我的CmakeList中,我添加了一个包含路径,并尝试链接.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);
}
#包括“argon2.h”
#包括
#包括
#包括
#定义hashlen32
#定义SALTLEN 16
#定义PWD“密码”
int main(){
uint8_t hash1[HASHLEN];
uint8_t盐[盐];
膜组(salt,0x00,SALTLEN);
uint8_t*pwd=(uint8_t*)标准偏差(pwd);
uint32_t pwdlen=strlen((字符*)pwd);
uint32_t_cost=2;//1次计算
uint32_t m_cost=(1在我的项目的project/
目录中,我已经用CMakeLists.txt将Argon2克隆到project/Argon2/
...
target_include_directories(target PUBLIC argon2/include)
target_link_libraries(target argon2)
在代码中,我通过#include
包含Argon2,它对我有效。对我有效的是下载存储库并在其中运行make
命令。这将创建静态库libargon2.a
。然后在CMakeLists.txt中添加
include_directories(libs/argon2/include)
link_directories(libs/argon2)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} argon2)
其中libs/argon2
表示下载存储库的相对路径。可能重复的我不认为这是重复的。至少我无法通过你提到的问题的答案来解决我的问题。好吧,问题帖子已经更改,不再是我建议的问题的重复。现在你知道了k使用库(target\u link\u libraries
),而不是“undefined reference”,您会收到关于无法找到库的错误。此错误是链接错误(无法创建可执行文件)还是运行错误(无法运行可执行文件)?看起来像第二种情况,因为这种错误通常在运行可执行文件时发生。是的,这是运行时的错误。但是我能够链接静态库(与.so相同的文件夹)使用target\u link\u库。但这并不是我想要的。可能是因为您的可执行文件缺少RPATH调优。请参阅关于RPATH以及CMake如何处理它。您可以始终使用ldd
检查RPATH设置的正确性。对于未来:尝试更精确地描述情况。您编写时,如果我构建应用程序,我会出错ode>,通常理解为在构建过程中捕获的错误。但实际上,这是在应用程序运行过程中发生的错误。