【问题标题】:libraries added via `add_subdirectory` face "No rule to make target while compiling.." error通过`add_subdirectory`添加的库面临“编译时没有规则来制作目标..”错误
【发布时间】:2020-04-11 21:39:17
【问题描述】:

我正在尝试清理legacy C-FORTRAN FLOSS code,但遇到了一个相当奇怪的错误。通过top CMakeLists.txt file 中的add_subdirectory 添加了一些库/文件夹。在build 文件夹中运行cmake .. 命令成功生成MakeFiles(some minor warnings 除外,这可能是误报)。然而,当使用make 编译时,我得到一个奇怪的错误:

扫描目标 umfpack 的依赖关系 mingw32-make[2]: 离开目录'/path/to/elmerfem/build' mingw32-make[2]:进入目录'/path/to/elmerfem/build' [ 46%] 构建 C 对象 umfpack/src/umfpack/CMakeFiles/umfpack.dir/umfpack_timer.c.o mingw32-make[2]: *** 没有规则来制作目标 '/mingw64/include/cblas.h','umfpack/src/umfpack/CMakeFiles/umfpack.dir/umfpack_tictoc.c.o' 需要。停止。 mingw32-make[2]: 离开目录'/path/to/elmerfem/build' mingw32-make[1]: *** [CMakeFiles/Makefile2:265: umfpack/src/umfpack/CMakeFiles/umfpack.dir/all] 错误 2 mingw32-make [1]:离开目录'/path/to/elmerfem/build' mingw32-make: *** [Makefile:163: all] 错误 2

我不知道如何调试。在这种情况下,/mingw64/include/cblas.h 存在,并且之前的 CMake 输出:

-- 寻找 Fortran sgemm -- 寻找 Fortran sgemm - 找到 -- 找到 BLAS:/mingw64/lib/libopenblas.dll.a -- 寻找 Fortran cheev -- 寻找 Fortran cheev - 找到 -- 找到带有 LAPACK API 的库。 -------------------------------------------------- -- BLAS 库:/mingw64/lib/libopenblas.dll.a -- LAPACK 库:/mingw64/lib/libopenblas.dll.a

显示BLASLAPACK 已成功找到。

如果您能帮助我了解问题所在以及如何解决,我将不胜感激。提前感谢您的支持。

环境是:

  • MSYS2:MSYS_NT-10.0-18363
  • Windows 版本 1909
  • cmake 版本 3.15.5
  • GNU Make 4.3
  • gcc.exe(Rev1,由 MSYS2 项目构建)9.3.0

P.S.1. 我刚刚在 macOS 上测试了代码,编译没有问题。所以这似乎是一个 Windows/MSYS2 特定的问题。

P.S.2. 有人告诉我应该安装 suitesparse 库,所以我安装了

 pacman -S mingw64/mingw-w64-x86_64-suitesparse

没用。

P.S.3. 同样在 this Tweet 之后,我应该澄清一下,我正在使用 MSYS2 的 CMake 和 GNU Make 包,正如 herehere 所解释的那样。

【问题讨论】:

  • 请不要在日志中替换路径和其他内容 - 准确复制粘贴错误日志,如显示给您的那样。首先,日志中的每一件事都可能很重要。你有一个奇怪的错误,并要求我们在日志中找出一个线索.. 但同时你已经删除了一些线索。其次,即使您可以只替换单个路径 -/path/to/elmerfem,我们也可以怀疑替换所有其他路径。例如。我问自己,“路径/mingw64/include/cblas.h 是真实的还是被替换了?”。这确实让日志更难理解。
  • 亲爱的@Tsyvarev 我替换的路径包括我的私人信息,恕我直言与问题无关。关于您的下一个问题,不,我没有更改 /mingw64/include/cblas.h 路径,因为它在这种情况下非常重要。
  • “恕我直言,这与问题无关” - 例如包含空格或其他特殊字符的路径有时与问题非常相关。在任何地方,最好不要替换 anything (我记得这样的注释在“帮助”文章中,但现在我找不到它......)。如果您的源或构建目录包含一些敏感信息,那么只需使用 other 目录即可。这真的很简单。比替换日志中的路径并尽量不要忘记在每次更新时替换它们要简单得多。
  • "但是向您保证没有特殊字符等" - 是的,没有特殊字符...除了它使用 native Windows 路径(绝对路径开始后跟一个冒号的驱动程序字母),而输出中的其余路径使用 Unix 样式(绝对路径以斜杠开头)。我不是 msys/mingw 关系方面的专家,但混合路径闻起来很香。喜欢这个问题的人:stackoverflow.com/questions/31293526/….
  • 尝试将您的cmake 命令更改为cmake -G"MSYS Makefiles" ..。使用mingw32-make 而不是make 可能是个坏主意,就像您的日志文件所指出的那样,这可能与您运行cmake 的方式有关。

标签: cmake compiler-errors msys2


【解决方案1】:

运行mingw64.exe(不是msys2.exe)。

确保安装以下软件包: mingw-w64-x86_64-cmake mingw-w64-x86_64-make mingw-w64-x86_64-suitesparse 和 C/C++ , Fortran 编译器。

注意:所有安装的包都必须在mingw64目录下。

更改 CMakeLists.txt 中的 WITH_MPI 值:

SET(WITH_MPI FALSE ...

使用以下命令查找 cmake 和 make 的路径: $ where cmake.exe$ where mingw32-make.exe

为简单起见,使用alias 命令:

alias my_cmake=/d/msys64/mingw64/bin/cmake.exe
alias my_make=/d/msys64/mingw64/bin/mingw32-make.exe

在 elmer 存储库中创建 build 目录,然后:

my_cmake -G "MinGW Makefiles" ..

my_make

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2010-10-24
    • 1970-01-01
    • 2020-09-21
    • 2014-06-13
    相关资源
    最近更新 更多