【发布时间】:2021-04-25 19:15:52
【问题描述】:
我正在尝试在 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_LIBRARY 是 NOTFOUND - 即使我应该在我的系统上安装它?!
在引用的日志中没有与此问题相关的任何内容:
$ 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
因此,显然链接步骤与编译是分开的,在 gcc 链接器调用中应该有 -lncurses 的地方,它显示为 -lCURSES_NCURSES_LIBRARY-NOTFOUND。
那么,我该如何说服cmake 在这里找到合适的curses 库?
【问题讨论】: