如何在Qt Creator中将Argon2库与cmake链接 我想在我的C++应用程序中使用密码哈希函数。但如果我构建应用程序,则会出现错误: error while loading shared libraries: libargon2.so.0: cannot open shared object file: No such file or directory

如何在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

到目前为止,我所做的是:我将源代码下载到Qt项目文件夹(thirdparty>Argon2)的一个子文件夹中。调用
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>,通常理解为在构建过程中捕获的错误。但实际上,这是在应用程序运行过程中发生的错误。