说服cmake在MSYS2中找到诅咒?

时间:2021-04-25 19:15:52

标签: gcc cmake curses

我正在尝试在 MSYS2(或 MINGW64,无论什么工作)中构建这个项目 https://github.com/ggerganov/hnterm

所以,我正在打开一个 MSYS2 shell;并注意这一点:

$ pacman -Ss curses | grep -A1 installed
mingw64/mingw-w64-x86_64-ncurses 6.2-3 [installed]
    System V Release 4.0 curses emulation library (mingw-w64)
mingw64/mingw-w64-x86_64-pdcurses 4.1.0-4 [installed]
    Curses library on the Win32 API (mingw-w64)
--
msys/cgdb 0.7.1-3 [installed]
    Curses-based interface to the GNU Debugger
--
msys/ncurses 6.2-1 (base) [installed]
    System V Release 4.0 curses emulation library
msys/ncurses-devel 6.2-1 (development) [installed]
    NCURSES headers and libraries

所以,我似乎对 MSYS2 和 MINGW64 都有 ncurses。以下是可能相关的文件的快速列表:

$ find /c/msys64/ -name '*curses.[ahd]*'
/c/msys64/mingw64/bin/libpdcurses.dll
/c/msys64/mingw64/include/ncurses/curses.h
/c/msys64/mingw64/include/ncurses/ncurses.h
/c/msys64/mingw64/include/ncursesw/curses.h
/c/msys64/mingw64/include/ncursesw/ncurses.h
/c/msys64/mingw64/include/pdcurses/curses.h
/c/msys64/mingw64/include/pdcurses.h
/c/msys64/mingw64/include/python2.7/py_curses.h
/c/msys64/mingw64/include/python3.8/py_curses.h
/c/msys64/mingw64/lib/libncurses.a
/c/msys64/mingw64/lib/libpdcurses.a
/c/msys64/mingw64/lib/libpdcurses.dll.a
/c/msys64/usr/include/curses.h
/c/msys64/usr/include/ncurses/curses.h
/c/msys64/usr/include/ncurses/ncurses.h
/c/msys64/usr/include/ncurses.h
/c/msys64/usr/include/ncursesw/curses.h
/c/msys64/usr/include/ncursesw/ncurses.h
/c/msys64/usr/include/python2.7/py_curses.h
/c/msys64/usr/include/python3.8/py_curses.h
/c/msys64/usr/lib/libcurses.a
/c/msys64/usr/lib/libcurses.dll.a
/c/msys64/usr/lib/libncurses.a
/c/msys64/usr/lib/libncurses.dll.a
/c/msys64/usr/lib/python2.7/lib-dynload/_curses.dll

因为我在 MSYS shell 中,所以我为 cmake 得到了这个:

$ which cmake
/usr/bin/cmake

$ cygpath -w `which cmake`
D:\msys64\usr\bin\cmake.exe

好的,那么,我尝试构建项目 - 如自述文件:

git clone https://github.com/ggerganov/hnterm --recursive
cd hnterm
mkdir build && cd build

...除了,我试试这个 cmake 命令:

$ cmake -G "MSYS Makefiles" .. --debug-trycompile
debug trycompile on
-- The C compiler identification is GNU 10.2.0
-- The CXX compiler identification is GNU 10.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/msys64/usr/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/usr/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Git: C:/msys64/usr/bin/git.exe (found version "2.31.1")
-- Looking for cbreak in CURSES_NCURSES_LIBRARY-NOTFOUND
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CURSES_NCURSES_LIBRARY
    linked by target "cmTC_858aa" in directory C:/src/hnterm/build/CMakeFiles/CMakeTmp

CMake Error at C:/msys64/mingw64/share/cmake-3.20/Modules/CheckLibraryExists.cmake:72 (try_compile):
  Failed to generate test project build system.
Call Stack (most recent call first):
  C:/msys64/mingw64/share/cmake-3.20/Modules/FindCurses.cmake:161 (CHECK_LIBRARY_EXISTS)
  third-party/imtui/CMakeLists.txt:69 (find_package)


-- Configuring incomplete, errors occurred!
See also "C:/src/hnterm/build/CMakeFiles/CMakeOutput.log".

所以,CURSES_NCURSES_LIBRARYNOTFOUND - 即使我应该在我的系统上拥有它?!

在引用的日志中没有任何与此问题相关的内容:

$ grep -i 'error\|curse' CMakeFiles/CMakeOutput.log

...并且在失败的临时目录中没有 C++ 源文件,或者:

$ ls ./CMakeFiles/CMakeTmp/CMakeFiles/cmTC_858aa.dir
build.make  cmake_clean.cmake  compiler_depend.make  compiler_depend.ts  depend.make  DependInfo.cmake  flags.make  progress.make

对我的唯一提示是 build.make 有一些我可能认识的 Makefile 行:

cmTC_858aa.exe: CMakeFiles/cmTC_858aa.dir/CheckFunctionExists.c.obj
cmTC_858aa.exe: CMakeFiles/cmTC_858aa.dir/build.make
        @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/D/src/hnterm_git/build/CMakeFiles/CMakeTmp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C executable cmTC_858aa.exe"
        /D/msys64/mingw64/bin/cmake.exe -E rm -f CMakeFiles/cmTC_858aa.dir/objects.a
        /D/msys64/usr/bin/ar.exe cr CMakeFiles/cmTC_858aa.dir/objects.a $(cmTC_858aa_OBJECTS) $(cmTC_858aa_EXTERNAL_OBJECTS)
        /D/msys64/usr/bin/gcc.exe  -DCHECK_FUNCTION_EXISTS=cbreak -Wl,--whole-archive CMakeFiles/cmTC_858aa.dir/objects.a -Wl,--no-whole-archive -o cmTC_858aa.exe -Wl,--out-implib,libcmTC_858aa.dll.a -Wl,--major-image-version,0,--minor-image-version,0  -lCURSES_NCURSES_LIBRARY-NOTFOUND

因此,显然链接步骤与编译是分开的,在 -lncurses 链接器调用中应该有 gcc 的地方,它说 -lCURSES_NCURSES_LIBRARY-NOTFOUND

那么,我如何说服 cmake 在这里找到合适的 curses 图书馆?

1 个答案:

答案 0 :(得分:0)

好吧,我好像到了某个地方,但很奇怪。

反正我用了cmake -G "MSYS Makefiles" ...命令,因为cmake本来是想做Visual Studio build的;对于 MSYS shell,这应该很奇怪。

而且由于我试图编译的程序似乎想要进行静态构建,我尝试直接引用其中一个静态库(在使用了一些 cmake-gui 来找到正确的选项名称之后):

cmake -G "MSYS Makefiles" -DCURSES_NCURSES_LIBRARY=/usr/lib/libncurses.a .. --debug-trycompile

这通过了 ncurses,但随后 curl 成为问题,然后是 ssl 等。

然后,出现了:我通过 ConEmu 使用 MSYS shell;由于我在粘贴这样的命令时遇到问题,我最终决定打开普通的 MSYS shell(随 MSYS2 一起提供)-我意识到它抱怨“CMake 错误:无法创建命名生成器 MSYS Makefile”!

等等,什么?它只是在同一个 shell 中生成了那些?!

所以,这是我见过的最奇怪的事情之一:

正常的 MSYS2 MSYS bash 说:

$ which cmake
/usr/bin/cmake

$ cmake --version
cmake version 3.20.1 ...

$ cygpath -w `which cmake`
C:\msys64\usr\bin\cmake.exe

ConEmu MSYS2 MSYS bash 说:

$ which cmake
/usr/bin/cmake

$ cmake --version
cmake version 3.20.1 ...

$ cygpath -w `which cmake`
C:\msys64\usr\bin\cmake.exe

所以在这两种情况下调用的 cmake 程序是相同的——但是:

ConEmu MSYS2 MSYS bash 说:

$ cmake --help | awk '$0 == "Generators" {i=1};i'
Generators

The following generators are available on this platform (* marks default):
  Visual Studio 16 2019        = Generates Visual Studio 2019 project files.
                                 Use -A option to specify architecture.
* Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
                                 Optional [arch] can be "Win64" or "IA64".
  Visual Studio 9 2008 [arch]  = Generates Visual Studio 2008 project files.
                                 Optional [arch] can be "Win64" or "IA64".
  Borland Makefiles            = Generates Borland makefiles.
  NMake Makefiles              = Generates NMake makefiles.
  NMake Makefiles JOM          = Generates JOM makefiles.
  MSYS Makefiles               = Generates MSYS makefiles.
  MinGW Makefiles              = Generates a make file for use with
                                 mingw32-make.
...

而正常的 MSYS2 MSYS bash 说:

$ cmake --help | awk '$0 == "Generators" {i=1};i'
Generators

The following generators are available on this platform (* marks default):
* Unix Makefiles               = Generates standard UNIX makefiles.
  Ninja                        = Generates build.ninja files.
  Ninja Multi-Config           = Generates build-<Config>.ninja files.
  CodeBlocks - Ninja           = Generates CodeBlocks project files.
  CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.
  CodeLite - Ninja             = Generates CodeLite project files.
  CodeLite - Unix Makefiles    = Generates CodeLite project files.
  Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
  Kate - Ninja                 = Generates Kate project files.
  Kate - Unix Makefiles        = Generates Kate project files.
  Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files.
  Sublime Text 2 - Unix Makefiles
                               = Generates Sublime Text 2 project files.

因此,出于某种原因,在 ConEmu 下运行的 MSYS2 MSYS bash 中的 cmake,检测 Windows 环境,并为此提供生成器 - 但在 MSYS2 MSYS bash 的普通终端中,它为 Unix 环境提供生成器 -即使是同一个程序!

因此,一旦在正常的 MSYS2 MSYS bash 终端中,我就可以使用 cmake .. - 并找到所有库:

$ cmake ..
-- The C compiler identification is GNU 10.2.0
-- The CXX compiler identification is GNU 10.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Git: /usr/bin/git.exe (found version "2.31.1")
-- Found Curses: /usr/lib/libcurses.dll.a
-- Looking for nodelay in /usr/lib/libncurses.dll.a
-- Looking for nodelay in /usr/lib/libncurses.dll.a - found
-- Found CURL: /usr/lib/libcurl.dll.a (found version "7.76.1")
-- Configuring done
-- Generating done
-- Build files have been written to: /c/src/hnterm/build

... 并运行 make 可以很好地构建 C++ 程序。现在奇怪的是,它可以运行,但它在正常的 MSYS2 MSYS bash 终端(编译的地方)中不起作用(没有渲染的字符)-但它在 ConEmu MSYS2 MSYS bash 终端中运行良好?!?!< /p>

好吧 - 至少问题解决了,还有一件事要小心......