所以我在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:
-
下载zookeeper 3.9.2 tar。
-
正在运行:mvn clean install-DskipTests
-
在zookeeper-client-c文件夹中创建了构建文件夹并运行:
cmake .. -DWANT_SYNCAPI=ON
-
跑
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上使用它们:
但在我的情况下,我既没有看到zookeper_mt.lib,也没有看到zookeeper_st.lib,只有zookeeper.lib,可能是因为它是没有我提到的函数和值的静态版本吗?
动物园管理员.h中的那些功能在下面
#ifdef THREADED
应该为定义
syncapi
建筑选项。
文中写道:
该包包括两个共享库:zookeeper_st和zookeepr_mt。前者只提供异步API和回调,用于集成到应用程序的事件循环中。这个库存在的唯一原因是在pthread库不可用或不稳定(即FreeBSD4.x)时支持平台。在所有其他情况下,应用程序开发人员都应该与zookeeper_mt链接,因为它包括对Sync和Async API的支持。
这是否意味着,如果我在windows上,没有pthread库,它将始终编译st版本,而我看到的错误是由于我的操作系统导致这些函数没有编译?
附笔:
我试图通过将zoo_create(线程化API中的函数)更改为
zoo_acreate
来自
#ifndef THREADED
而且它并没有以同样的方式被识别为一个符号。
附笔
:
添加#define USE_STATIC_LIB
添加define更改了输出,现在看起来是:
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol create_hashtable referenced in function create_zk_hashtable [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_insert referenced in function activateWatcher [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_search referenced in function activateWatcher [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_remove referenced in function add_for_event [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_count referenced in function collectWatchers [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_destroy referenced in function destroy_zk_hashtable [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_iterator referenced in function collectWatchers [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_iterator_advance referenced in function collectWatchers [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] zookeeper.lib(zk_hashtable.obj) : error LNK2019: unresolved external symbol hashtable_iterator_remove referenced in function destroy_zk_hashtable [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[build] C:\Users\YOSSI\CLionProjects\DSE\build\Release\DSEApp.exe : fatal error LNK1120: 9 unresolved externals [C:\Users\YOSSI\CLionProjects\DSE\build\DSEApp.vcxproj]
[driver] Build completed: 00:00:34.058
[build] Build finished with exit code 1
第3页:
看起来这解决了部分问题,因为现在没有识别出更深层的依赖关系,因为构建的zookeeper的源具有以下结构布局:
C:\ZooKeeperC-Release\apache-zookeeper-3.9.2\zookeeper-client\zookeeper-client-c\src>tree /f
Folder PATH listing
Volume serial number is AE6B-2066
C:.
â addrvec.c
â addrvec.h
â cli.c
â load_gen.c
â mt_adaptor.c
â recordio.c
â st_adaptor.c
â winport.c
â winport.h
â zk_adaptor.h
â zk_hashtable.c
â zk_hashtable.h
â zk_log.c
â zk_sasl.c
â zk_sasl.h
â zookeeper.c
â
ââââhashtable
hashtable.c
hashtable.h
hashtable_itr.c
hashtable_itr.h
hashtable_private.h
LICENSE.txt