1

我正在尝试使用 cygwin 在 Windows 上安装 zookeeper c 绑定

我收到以下错误

Creating library file: .libs/libzookeeper_st.dll.a
./.libs/libzkst.a(zk_hashtable.o): In function `collectWatchers':
/usr/local/zookeeper-3.4.3/src/c/src/zk_hashtable.c:285: undefined reference to `__imp__ZOO_SESSION_EVENT'
./.libs/libzkst.a(zk_hashtable.o): In function `do_foreach_watcher':
/usr/local/zookeeper-3.4.3/src/c/src/zk_hashtable.c:273: undefined reference to `__imp__ZOO_SESSION_EVENT'
collect2: ld returned 1 exit status
Makefile:567: recipe for target `libzookeeper_st.la' failed
make: *** [libzookeeper_st.la] Error 1

它在 linux CentOS 下编译良好

4

1 回答 1

0

这可能来得太晚了。我遇到了完全相同的问题,并且从 Zookeeper 3.4.5 开始仍然存在。此外,使用较新版本的 JRE 启动时,提供的脚本无法正确终止 Java.exe。

注意:您需要安装 awk 才能使用以下解决方案。完成后,您可以进行以下更改,以便能够通过 bash 脚本正确编译和运行:

  1. 在文件 zookeeper-3.4.x/src/c/src/zk_hashtable.c 中,将 ZOO_SESSION_EVENT 的所有实例替换为 SESSION_EVENT_DEF。如果您查看源代码,这些定义是等效的,并且更改它们将允许您正确地制作。您现在可以使用“make”进行定期编译。

  2. 如果你有最新版本的 Java,bin 目录中 Zookeeper 提供的脚本(例如,zkServer.sh)将无法正确杀死 Java。事实上,JRE 无法响应从 Cygwin 传递给它的任何 SIGINT / SIGKILL 等信号。为了解决这个问题,您可以在 zookeeper-3.4.x/bin/zkServer.sh 中更改以下内容:

    ZOOCFG=`cygpath -wp "$ZOOCFG"`
    # cygwin has a "kill" in the shell itself, gets confused
    KILL=/bin/kill
    

    将其替换为以下内容,以强制使用 Windows taskkill,JRE 不能忽略:

    ZOOCFG=`cygpath -wp "$ZOOCFG"`
    # cygwin has a "kill" in the shell itself, gets confused
    KILL="taskkill /F /PID"
    

    此外,还要删除以下行:

    $KILL -9 $(cat "$ZOOPIDFILE")
    rm "$ZOOPIDFILE"
    echo STOPPED
    

    用这个替换它们,强制脚本向 taskkill 发送 Windows PID,而不是创建的 Java 任务的 Cygwin PID:

    if $cygwin
    then
        CYGPID=$(cat "$ZOOPIDFILE")
        WINPID=$(ps | awk "/$CYGPID/ { print \$4 }")
        $KILL $WINPID
    else
        $KILL $(cat "$ZOOPIDFILE")
    fi
    rm "$ZOOPIDFILE"
    echo STOPPED
    

你完成了!同样,如果您打算在第二步中使用修复程序,请确保您已安装 awk。

于 2013-07-10T08:30:14.990 回答