【问题标题】:Including expect/tcl library for C/C++包括用于 C/C++ 的 expect/tcl 库
【发布时间】:2014-10-23 17:15:09
【问题描述】:

最近我发现了一个example,介绍了如何在 C++ 中使用 expect 库。我试图编译它,但编译器(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...

我该如何解决这个问题?

[编辑] 当我尝试将其与期望库(-lexpect)链接时,出现以下错误:

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

我确定 - tcl8.6 和 expect 5.45-4 都已安装。

【问题讨论】:

    标签: c++ c tcl expect include-path


    【解决方案1】:

    现在分发 Expect 的常用方式是将共享库放在非标准位置,并通过完整路径名动态地loads。这很好用并且对大多数人来说是最小的大惊小怪,但确实使在您自己的代码中使用 Expect 的 C 接口变得相当困难。

    最简单的方法是从源代码构建您自己的副本,特别是因为这可以让您控制它的构建方式。这尤其可以包括将大多数符号保留在库中,而不是在安装时剥离它们,这对调试有很大帮助。您可能应该使用current supported version。 (是的,它是几年前的一个版本。大多数时候它不需要大量的支持工作。)

    【讨论】:

      【解决方案2】:

      在构建过程中,您尚未链接到 expect 库。将-lexpect 添加到您的g++ 命令中。

      【讨论】:

      • 其实我试图链接它,但我得到了以下错误:/usr/bin/ld: cannot find -lexpect
      • 我对 Linux 构建链并不太熟悉,但我假设您没有正确安装该库,或者您的链接器不知道在哪里寻找它。你安装expect-dev了吗?您能否在您的驱动器中搜索该库并查看它的位置并找出您的链接器找不到它的原因?
      • 不幸的是,我的发行版(Arch Linux)没有名为 expect-dev 的包。正如我之前所说,我已经搜索过这个库。我找到的唯一文件列在上面的问题中。
      • 如果没有预建库,那么您必须自己构建它。看起来sourceforge.net/projects/expect/files 有源文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多