如何在Qt Creator中链接Argon2库和cmake

时间:2016-01-29 15:54:08

标签: c++ qt cmake shared-libraries .so

我想在我的C ++应用程序中使用密码散列函数Argon2。但是如果我构建应用程序,我会收到错误:

error while loading shared libraries: libargon2.so.0: cannot open shared object file: No such file or directory

到目前为止我做了什么:我在我的Qt项目文件夹(thirdparty> 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 include path和TRIED来链接.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还是很陌生,所以我不知道我的程序是否正确(显然不是,因为它不起作用)。

  1. 是否可以仅链接.so文件?
  2. 我是否必须在项目中包含Argon库的整个目录(就像我尝试过的那样)?
  3. 告诉我的链接器如何正确找到库的必要步骤是什么?
  4. 修改

    This post似乎与我的相似。但是如果.so文件足够以及如何链接到我的debian系统的软件包管理器没有安装的库,我就无法找到答案。

2 个答案:

答案 0 :(得分:0)

在我的项目project/中,我已将Argon2与project/argon2/克隆到CMakeLists.txt

...
target_include_directories(target PUBLIC argon2/include)
target_link_libraries(target argon2)

在代码中,我通过#include <argon2.h>包含了Argon2,它对我有用。

答案 1 :(得分:0)

对我有用的是下载存储库并在其中运行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代表下载的存储库的相对路径。