我正在尝试在 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
因此,显然链接步骤与编译是分开的,在 -lncurses
链接器调用中应该有 gcc
的地方,它说 -lCURSES_NCURSES_LIBRARY-NOTFOUND
。
那么,我如何说服 cmake
在这里找到合适的 curses
图书馆?
答案 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>
好吧 - 至少问题解决了,还有一件事要小心......