cmake 使用库redis++时发生叮当声链接错误

b4lqfgs4  于 2022-12-13  发布在  Redis
关注(0)|答案(1)|浏览(258)

我正在使用从Visual Studio安装程序安装的Windos 10,Clang 11.0。我想使用库redis++,所以我首先安装了库hiredis(我用选择工具集“cmake -T ClangCL...”构建了它),然后用类似的cmake命令安装了redis++。
简单测试项目的CMakeLists.txt文件如下所示:

cmake_minimum_required(VERSION 3.18)
project(HELLO)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(target hello.cpp)

find_package(hiredis)
target_include_directories(target PUBLIC ${HIREDIS_HEADER})
target_link_libraries(target ${HIREDIS_LIB})

find_package(redis++)
target_include_directories(target PUBLIC ${REDIS_PLUS_PLUS_HEADER})
target_link_libraries(target ${REDIS_PLUS_PLUS_LIB})

hello.cpp看起来像:

#include <sw/redis++/redis++.h>

using namespace sw::redis;

in main(int argc, char *argv[]){
    auto redis = Redis("tcp://127:0:0:1:6379");
    const sw::redis::StringView key = "test";
    redis.rpop(key);

    return 0;
}

当我构建项目时,我得到错误lld-link error: undefined symbol sw::redis::Redis::rpop。如果我只是调用redis.pop()(不传递参数),我得到too few arguments to function call
所以我不太确定是怎么回事,如果我以无效的方式调用rpop(),它会看到函数签名,并告诉我需要传递参数,但当我传递它时,它会说链接错误。

jum4pzuy

jum4pzuy1#

成功调用

find_package(redis++)

为共享库创建IMPORTED目标redis++::redis++,为静态库创建IMPORTED目标redis++::redis++_static。为了使用Redis++,你需要将这些目标中的一个链接到可执行文件中:

target_link_libraries(target redis++::redis++)

(与IMPORTED目标的链接会自动设置包含目录,因此不需要调用target_include_directories。)
如果在相应的find_pathfind_library调用中设置这些变量,则使用变量REDIS_PLUS_PLUS_HEADERREDIS_PLUS_PLUS_LIB的方法有效,如其文档中所述:https://github.com/sewenew/redis-plus-plus#build-with-cmake。
与其他项目一样,find_package方法(在该文章开头描述)始终是首选方法。

相关问题