链接zookeeper-client-c时出错:无法解析的符号

问题描述 投票:0回答:1

所以我有一个简单的 C++ 模块,它使用了一些

zookeeper-client-c API
,特别是函数:

zoo_exists
zoo_create
zoo_get_children
zoo_get
zookeeper_init
zookeeper_close

和价值观:

ZOO_EXPIRED_SESSION_STATE
ZOO_SESSION_EVENT
ZOO_CONNECTED_STATE
ZOO_CREATED_EVENT
ZOO_DELETED_EVENT
ZOO_CHANGED_EVENT
ZOO_CHILD_EVENT
ZOO_EPHEMERAL
ZOO_OPEN_ACL_UNSAFE

当我构建项目时,我得到:

[build] DSE.lib(ZkManager.obj) : error LNK2019: unresolved external symbol __imp_zoo_create referenced in function "private: void __cdecl ZkManager::createNode(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?createNode@ZkManager@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkManager.obj) : error LNK2019: unresolved external symbol __imp_zoo_exists referenced in function "private: void __cdecl ZkManager::createNode(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?createNode@ZkManager@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkManager.obj) : error LNK2019: unresolved external symbol __imp_zoo_get referenced in function "private: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl ZkManager::getData(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?getData@ZkManager@@AEAA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV23@@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkManager.obj) : error LNK2019: unresolved external symbol __imp_zoo_get_children referenced in function "private: class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __cdecl ZkManager::getChildren(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?getChildren@ZkManager@@AEAA?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@3@@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkManager.obj) : error LNK2019: unresolved external symbol __imp_ZOO_OPEN_ACL_UNSAFE referenced in function "private: void __cdecl ZkManager::createNode(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?createNode@ZkManager@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkManager.obj) : error LNK2019: unresolved external symbol __imp_ZOO_EPHEMERAL referenced in function "private: void __cdecl ZkManager::createNode(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?createNode@ZkManager@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_zookeeper_init referenced in function "public: __cdecl ZkSync::ZkSync(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0ZkSync@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_zookeeper_close referenced in function "public: virtual __cdecl ZkSync::~ZkSync(void)" (??1ZkSync@@UEAA@XZ) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_EXPIRED_SESSION_STATE referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_CONNECTED_STATE referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_CREATED_EVENT referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_DELETED_EVENT referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_CHANGED_EVENT referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_CHILD_EVENT referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] DSE.lib(ZkSync.obj) : error LNK2019: unresolved external symbol __imp_ZOO_SESSION_EVENT referenced in function "public: static void __cdecl ZkSync::watcher(struct _zhandle *,int,int,char const *,void *)" (?watcher@ZkSync@@SAXPEAU_zhandle@@HHPEBDPEAX@Z) [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] C:\Users\YOSSI\CLionProjects\DSE\build\Release\DSEApp.exe : fatal error LNK1120: 15 unresolved externals [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[proc] The command: "C:\Program Files\CMake\bin\cmake.EXE" --build c:/Users/YOSSI/CLionProjects/DSE/build --config Release --target ALL_BUILD -j 6 -- exited with code: 1
[driver] Build completed: 00:01:02.133
[build] Build finished with exit code 1

我按照以下步骤构建了我的 Zookepeer:

  1. 下载了zookeeper 3.9.2 tar。
  2. 运行:mvn clean install -DskipTests
  3. 在zookeeper-client-c文件夹中创建构建文件夹并运行:
    cmake .. -DWANT_SYNCAPI=ON 
  4. cmake --build . --config Release 

C:\ZooKeeperC-Release\apache-zookeeper-3.9.2\zookeeper-client\zookeeper-client-c\Release
路径中我有:

    cli.exe
    hashtable.lib
    zookeeper.lib

cmakelists(有点乱):

cmake_minimum_required(VERSION 3.12)
project(DSE)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(MSVC)
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
endif()

if(MSVC)
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /VERBOSE:LIB")
endif()

# Set the path to ASIO
set(ASIO_INCLUDE_DIR "C:/asio-1.30.2/include")

# Include ASIO
include_directories(${ASIO_INCLUDE_DIR})

# Add definitions for standalone ASIO and Crow
add_definitions(-DASIO_STANDALONE)
add_definitions(-DCROW_DISABLE_STATIC_DIR)
add_definitions(-DCROW_DISABLE_COMPRESSION)
add_definitions(-DCROW_USE_ASIO)
add_definitions(-DTHREADED)
add_definitions(-DWIN32)

# If you're on Windows, you might need this
if(WIN32)
    add_definitions(-D_WIN32_WINNT=0x0601)
endif()

# Set ASIO include directory for Crow
set(CROW_ASIO_INCLUDE_DIR ${ASIO_INCLUDE_DIR})

# Find Crow
find_package(Crow CONFIG REQUIRED)

# Set gRPC_DIR
set(gRPC_DIR "C:/grpc/lib/cmake/grpc")
set(Protobuf_DIR "C:/grpc/cmake")
set(absl_DIR "C:/grpc/lib/cmake/absl")
set(utf8_range_DIR "C:/grpc/lib/cmake/utf8_range")
set(jsoncpp_DIR "C:/jsoncpp/lib/cmake/jsoncpp")

find_package(absl CONFIG REQUIRED)
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)

# Find gRPC and Protocol Buffers
find_package(gRPC CONFIG REQUIRED)
find_package(Protobuf CONFIG REQUIRED)

# Find JsonCpp
find_package(jsoncpp CONFIG REQUIRED)

# Set the path to ZooKeeper
set(ZOOKEEPER_INCLUDE_DIR "C:/ZooKeeperC-Release/apache-zookeeper-3.9.2/zookeeper-client/zookeeper-client-c/include")
set(ZOOKEEPER_GENERATED_INCLUDE_DIR "C:/ZooKeeperC-Release/apache-zookeeper-3.9.2/zookeeper-client/zookeeper-client-c/generated")
set(ZOOKEEPER_LIB_DIR "C:/ZooKeeperC-Release/apache-zookeeper-3.9.2/zookeeper-client/zookeeper-client-c/Release")

# Include ZooKeeper
include_directories(${ZOOKEEPER_INCLUDE_DIR})
include_directories(${ZOOKEEPER_GENERATED_INCLUDE_DIR})

# Find the ZooKeeper library
find_library(ZOOKEEPER_LIB NAMES zookeeper PATHS ${ZOOKEEPER_LIB_DIR})

# Define the DSE library
add_library(DSE
    app/Server.cpp
    app/controllers/VoteController.cpp
    app/controllers/VotesMap.cpp
    app/models/CommandElections.cpp
    app/models/ControllerMessage.cpp
    app/models/Vote.cpp
    app/models/VotesCount.cpp
    app/models/VotesCountKey.cpp
    app/paxos/AcceptAndAccepted.cpp
    app/paxos/PrepareAndPromise.cpp
    app/paxos/SessionsMap.cpp
    app/utils/ReadStates.cpp
    app/utils/ReadVoters.cpp
    gRPCObjects/interceptors/ClientInterceptor.cpp
    gRPCObjects/interceptors/ServerInterceptor.cpp
    gRPCObjects/paxos/FuturePaxosGreetingClient.cpp
    gRPCObjects/paxos/GreetingPaxosClient.cpp
    gRPCObjects/paxos/GreetingPaxosServer.cpp
    gRPCObjects/GreetingClient.cpp
    gRPCObjects/GreetingServer.cpp
    gRPCObjects/FutureRemoteGreetingClient.cpp
    protos/Paxos.grpc.pb.cc
    protos/Paxos.pb.cc
    protos/Vote.grpc.pb.cc
    protos/Vote.pb.cc
    zk/ZkConnector.cpp
    zk/ZkManager.cpp
    zk/ZkSync.cpp
)

# Include directories
target_include_directories(DSE PUBLIC 
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/app
    ${CMAKE_CURRENT_SOURCE_DIR}/gRPCObjects
    ${CMAKE_CURRENT_SOURCE_DIR}/protos
    ${CMAKE_CURRENT_SOURCE_DIR}/app/models
    ${CMAKE_CURRENT_SOURCE_DIR}/app/controllers
    ${CMAKE_CURRENT_SOURCE_DIR}/app/paxos
    ${CMAKE_CURRENT_SOURCE_DIR}/app/utils
    ${CMAKE_CURRENT_SOURCE_DIR}/zk
    "C:/grpc/include"
    "C:/jsoncpp/include"
    ${ASIO_INCLUDE_DIR}
    ${ZOOKEEPER_INCLUDE_DIR}
    ${ZOOKEEPER_GENERATED_INCLUDE_DIR}
)

# Option for threaded/non-threaded version
option(USE_THREADED "Use threaded version of ZooKeeper" ON)

# Set compile definitions based on USE_THREADED option
if(USE_THREADED)
    target_compile_definitions(DSE PUBLIC THREADED)
endif()

# Link libraries
target_link_libraries(DSE PUBLIC
    gRPC::grpc++
    protobuf::libprotobuf
    jsoncpp_lib
    absl::base
    absl::strings
    Crow::Crow
    ${ZOOKEEPER_LIB}
)

target_compile_definitions(DSE PUBLIC
    WIN32
    THREADED
    ASIO_STANDALONE
    CROW_USE_ASIO
)

# Add executable
add_executable(DSEApp app/main.cpp)
target_link_libraries(DSEApp PRIVATE DSE)

# If on Windows, add these definitions
if(WIN32)
    target_compile_definitions(DSE PUBLIC
        _WIN32_WINNT=0x0601
        WIN32_LEAN_AND_MEAN
        NOMINMAX
    )
endif()

文档有非常不同的构建说明,但即使通过 MSYS2,我也没有设法让它们在 Windows 上工作:

enter image description here

但就我而言,我没有看到zookeper_mt.lib或zookeeper_st.lib,而只是zookeeper.lib,可能它是没有我提到的函数和值的静态版本?

zookeeper.h 中的那些函数位于

#ifdef THREADED
下,应为
syncapi
构建选项定义。

文中写道:

该软件包包含两个共享库:zookeeper_st 和zookeeper_mt。前者仅提供异步 API 和回调以集成到应用程序的事件循环中。该库存在的唯一原因是支持 pthread 库不可用或不稳定的平台(即 FreeBSD 4.x)。在所有其他情况下,应用程序开发人员应与 Zookeeper_mt 链接,因为它包含对同步和异步 API 的支持。

这是否意味着,如果我在 Windows 上并且没有 pthread 库,它将始终编译 st 版本,而我看到的错误是由于这些函数只是因为我的操作系统而没有编译?

c++ cmake linker apache-zookeeper
1个回答
0
投票
cmake_minimum_required(VERSION 3.12)
project(DSE)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(MSVC)
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
endif()

if(MSVC)
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /VERBOSE:LIB")
endif()

这些线条是不正确的。首先,他们必须在

project
之前设置 cmake 变量。其次,规范的方法是从 cmake 3.15 开始为 cmake 变量设置一个值
CMAKE_MSVC_RUNTIME_LIBRARY

设置后尝试移动

project(DSE)

。或者更好,如果你的 cmake 是 3.15 更新版本:

cmake_minimum_required(VERSION 3.15) project(DSE) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>DLL) endif() if(MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /VERBOSE:LIB") endif() project(DSE) # The rest part of CMakeLists.txt goes here
    
© www.soinside.com 2019 - 2024. All rights reserved.