所以我有一个简单的 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:
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,可能它是没有我提到的函数和值的静态版本?
zookeeper.h 中的那些函数位于
#ifdef THREADED
下,应为 syncapi
构建选项定义。
文中写道:
该软件包包含两个共享库:zookeeper_st 和zookeeper_mt。前者仅提供异步 API 和回调以集成到应用程序的事件循环中。该库存在的唯一原因是支持 pthread 库不可用或不稳定的平台(即 FreeBSD 4.x)。在所有其他情况下,应用程序开发人员应与 Zookeeper_mt 链接,因为它包含对同步和异步 API 的支持。
这是否意味着,如果我在 Windows 上并且没有 pthread 库,它将始终编译 st 版本,而我看到的错误是由于这些函数只是因为我的操作系统而没有编译?
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