代码之家  ›  专栏  ›  技术社区  ›  Ilya.K.

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

  •  0
  • Ilya.K.  · 技术社区  · 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,可能是因为它是没有我提到的函数和值的静态版本吗?

    动物园管理员.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
    
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   3CxEZiVlQ    1 年前
    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()
    

    这些线条不合适。首先,他们必须在之前设置cmake变量 project 。其次,规范的方法是为cmake变量设置一个值 CMAKE_MSVC_RUNTIME_LIBRARY 自cmake 3.15以来。

    试着移动 project(DSE) 之后 set(CMAKE_* 。或者更好,如果您的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