包括用于C/C++的expect/tcl库

Including expect/tcl library for C/C++

本文关键字:expect tcl C++ 用于 包括      更新时间:2023-10-16

最近我发现了一个如何在C++中使用期望库的例子。我试着编译它,但编译器(g++)说tcl8.5/expect.h不存在。所以我尝试包含tcl8.6/expect.h-仍然是相同的错误。我检查了/usr/include/目录,当我注意到没有tcl8.x目录时,我并不感到惊讶。我已经搜索了名称中带有"expect"的文件。以下是我的发现:

/usr/include/expect_tcl.h
/usr/include/expect_comm.h
/usr/include/expect.h

不幸的是,当我试图包括其中任何一个时,我在编译过程中得到了以下错误列表:

> g++ test.cpp -Wall -std=c++0x -ltcl8.6 -lglog -o test
  /tmp/cce8k1BA.o: In function `task(std::string const&, std::string const&, std::string const&)':
  test.cpp:(.text+0x16): undefined reference to `exp_is_debugging'
  test.cpp:(.text+0x20): undefined reference to `exp_timeout'
  test.cpp:(.text+0x38): undefined reference to `exp_popen'
  etc...

我该如何解决这个问题?

[EDIT]当我试图将它与expectlib(-xspect)链接时,我得到了以下错误:

/usr/bin/ld: cannot find -lexpect
collect2: error: ld returned 1 exit status

我确信-tcl8.6和expect5.45-4都已安装。

现在常见的分发Expect的方式是将共享库放在一个非标准的位置,load通过完整路径名对其进行动态分配。这样做效果很好,对大多数人来说也没什么大惊小怪的,但确实让在自己的代码中使用Expect的C接口变得相当困难。

最简单的方法是从源代码构建自己的副本,尤其是这样可以让你控制它是如何构建的。这尤其包括将大多数符号保留在库中,而不是在安装时剥离它们,这将对调试有很大帮助。您可能应该使用当前支持的版本。(是的,这是几年前的版本。大多数时候它不需要太多的支持。)

您在构建过程中没有链接到expect库。将-lexpect添加到g++命令中。