最近我发现了一个如何在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++
命令中。