CMake 错误:找不到 SWIG(缺少:SWIG_DIR)

Posted

技术标签:

【中文标题】CMake 错误:找不到 SWIG(缺少:SWIG_DIR)【英文标题】:CMake Error: Could NOT find SWIG (missing: SWIG_DIR) 【发布时间】:2018-01-22 13:04:33 【问题描述】:

我想测试一下Pocketsphinx in Node.JS。它说我需要安装 Swig 3.0.7 或更高版本。

我认为我正确安装了所有其他依赖项。我现在什至可以在终端中输入 Swig 命令,但是每当我运行 npm install pocketsphinx 时,我都会收到此错误:

CMake Error at /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find SWIG (missing: SWIG_DIR) (Required is at least version
  "3.0.7")
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindSWIG.cmake:75 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:4 (find_package)

我试过brew install swignpm install swignpm install -g swig。我尝试去the swig download page 并按照安装说明进行操作,但我似乎没有做任何事情来阻止错误的发生。顺便说一下,我正在 Macbook 上尝试这个。

我真的不知道我在这里做什么。我只是想测试一下 Pocketsphinx,现在我已经在 4 个不同的地方安装了 Swig,而 CMake 似乎无法识别其中的任何一个。

任何帮助都会很棒!

【问题讨论】:

【参考方案1】:

来到这里寻找基于 Windows 的错误。我找到了一个似乎对我有用的解决方案,所以决定在这里发布。

在“系统变量”部分创建两个环境变量:SWIG_DIRSWIG_EXECUTABLE。这些必须分别指向/path/to/the/swig/dir//path/to/the/swig/dir/swig.exe。 在此之后,再向 PATH 变量添加一项:/path/to/the/swig/dir。通过在命令提示符下键入 swig 来测试它。它应该显示一条消息must specify an input file. Use -help for available options。 重新启动计算机以应用所有环境变量更改。 find_package(SWIG required) 现在应该可以正常工作了。

【讨论】:

至于最后一步,重启IDE就够了。我尝试了您的步骤并重新启动了我的 CLion,而不是我的整个计算机。它只是工作。 请注意,对我来说,这不起作用。您只需提供SWIG_EXECUTABLE。 CMake 可以从SWIG_EXECUTABLE 派生SWIG_DIR,另外SWIG_DIR 应该指向包含swig 库的目录,通常是/path/to/swig/dir/Lib。如果遇到error : Unable to find 'swig.swg' 之类的错误,请尝试删除SWIG_DIR 变量。 为了清楚起见,考虑代码高亮PATH。此外,这适用于 debian/ubuntu【参考方案2】:

检查source code for the FindSwig.cmake

不幸的是,如果查找脚本没有按预期工作,并且您没有立即明白为什么会出现这种情况,您通常必须深入挖掘其来源。在您的情况下,CMake 似乎能够找到并运行 SWIG 可执行文件,但随后无法获取 swig 目录。

尝试手动运行swig -swiglib 并检查打印的目录是否确实包含swig.swg 文件。此外,请确保 CMake 找到的 swig 可执行文件实际上是正确的(您可以通过在 cmake-guiccmake curses 接口或 CMakeCache.txt 文件中检查 SWIG_EXECUTABLE 的值来验证这一点直接)。

请注意,一旦找到可执行路径,CMake 将不会更新它!因此,如果您对系统进行了影响可执行位置的更改,则必须清除缓存(例如,通过删除 CMakeCache.txt)并重新运行 CMake 以使更改生效。

【讨论】:

swig -swiglib 打印出/usr/local/share/swig/3.0.12。这个目录确实包含swig.swg。我还是不太明白FindSwig.cmake 的工作原理。我不知道它试图搜索的地方。抱歉,我很愚蠢,这就是我使用 Node.JS 的原因 @MysteryPancake 你检查了CMakeCache.txtSWIG_EXECUTABLE 的值吗?该文件位于项目的二进制目录中,即。项目中您还运行 CMake 的目录。别担心,每个人在开始使用 CMake 时都会觉得自己很愚蠢:P 我什至在任何地方都找不到CMakeCache.txt。我感到愚蠢的原因是因为我真的不知道,我什至不知道 CMake 是什么或它做了什么。我只知道 Node.JS 和其他一些无用的垃圾。我想如果该文件丢失,我将 CMake 设置错了。抱歉这个愚蠢的问题 CMakeCache.txt 在 node-pocketsphinx 的 build 子文件夹中【参考方案3】:

我试着自己解决。问题出在我输入npm install swig时。

我忘记设置这个版本的 Swig,编译器正在使用它。

我输入了sudo npm uninstall swig,它运行良好。我觉得自己很傻!

【讨论】:

以上是关于CMake 错误:找不到 SWIG(缺少:SWIG_DIR)的主要内容,如果未能解决你的问题,请参考以下文章

Swig:要么丢失 /bits/c++config.h 要么找不到包含

Openshift 无法加载 c++ bson 扩展/找不到模块('swig')

PocketSphinx 安装找不到 swig.exe

Ruby 和 SWIG 与 CMake

CMake - SWIG - 移植动态库

CMake Swig:如何在包含的 .i 文件上添加依赖项