CMake错误:无法找到SWIG(缺失:SWIG_DIR)

15

我想测试在Node.JS中使用Pocketsphinx,它说我需要安装3.0.7或更高版本的Swig。

我认为我已经正确安装了所有其他依赖项。现在我甚至可以在终端中输入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 swig, npm install swig, 和 npm install -g swig。我也尝试访问swig下载页面并按照安装说明进行操作,但无论我做什么都无法停止错误的发生。顺便说一下,我是在Macbook上进行尝试的。

我真的不知道我在做什么。我只是想测试一下Pocketsphinx,现在我已经在4个不同的位置安装了Swig,但CMake似乎不能识别它们中的任何一个。

任何帮助都将不胜感激!

4个回答

11

来到这里是为了寻找基于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而不是整个计算机。它完美运行。 - Eric
2
请注意,对我来说这并没有起作用。您只需要提供 SWIG_EXECUTABLE。CMake可以从 SWIG_EXECUTABLE 推导出 SWIG_DIR,此外,SWIG_DIR 应该指向包含 swig 库的目录,通常是 /path/to/swig/dir/Lib。如果您遇到像 error : Unable to find 'swig.swg' 这样的错误,请尝试删除 SWIG_DIR 变量。 - Verhoevenv
考虑为了清晰起见,对代码进行高亮显示的“PATH”设置。此外,在Debian / Ubuntu中使用此功能。 - user27221
在Windows 11上,我不得不同时指定SWIG_EXECUTABLE并将父目录添加到系统的PATH变量中,否则构建仍然会失败。然而,不必设置SWIG_DIR,正如@Verhoevenv所描述的那样。 - undefined

6

请查看查找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
@MysteryPancake 你有检查过 CMakeCache.txtSWIG_EXECUTABLE 的值吗?这个文件位于你的项目二进制目录中,也就是你运行 CMake 的项目目录。别担心,每个人在开始使用 CMake 时都会感到很愚蠢 :P - ComicSansMS
我甚至找不到 CMakeCache.txt 文件的位置。我感到愚蠢的原因是因为我完全不知道,我甚至不知道 CMake 是什么或者它的作用是什么。我只知道 Node.JS 和其他一些无用的东西。如果缺少那个文件,我想我可能设置 CMake 错误了。对于这个愚蠢的问题,我很抱歉。 - MysteryPancake
CMakeCache.txt 位于 node-pocketsphinx 的 build 子文件夹中。 - Nikolay Shmyrev

1
对于Linux系统:只需使用sudo apt install swig命令安装swig即可。

1

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

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

我输入了sudo npm uninstall swig,然后它完美地工作了。我感到非常愚蠢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接