在 cygwin 上使用 cmake 的问题
Issues using cmake on cygwin
我有一个以前 linux 只在 makefile 中的项目。
我已经成功地将它迁移到 cmake 并且工作正常,它在纯 linux (makefile --> so) 和纯 windows (visual studio --> dll 中编译) 没有问题。它还在 linux 上为 windows 编译得很好(使用 mingw --> dll)。
但是,对于集成和脚本兼容性问题,我必须为 windows (dll) 生成和构建代码,但是在 cygwin 环境中(cygwin 的 gcc 提供了一个 dll),就像使用的旧 makefile去做。
(由于外部限制,我必须这样做)
我已经在我的 cygwin 上安装了 "make" 和 "cmake" 包。
当我尝试在 cygwin 控制台中生成 makefile 时,它卡住了:
$ cmake -G "Unix Makefiles" ../Sources
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
当我停止它 (ctrl-C) 时,它什么也没说,"Makefile" 文件出现在我的构建目录中,所以我尝试编译它:
$ make
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
它似乎又重新生成了(我再次打印了我的 cmake,Makefile 文件消失然后重新出现,命令再次卡在同一阶段)。
这一次,当我停止它时,它会打印以下消息:
$ make
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
make: *** [Makefile:224: cmake_check_build_system] Interrupt
我试图查找 Makefile,似乎是以下命令阻塞了:
cmake_check_build_system:
$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check- build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system
我搜索了一下,找到了,所以这似乎只是一种设置目录的方法。
我已经手动尝试 运行 结果是一样的:
$ cmake -H../Sources -B. --check-build-system CMakeFiles/Makefile.cmake 0
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
我不知道自己做错了什么,我被卡住了,有人可以帮助我吗?
编辑:运行 make in verbose mode 提供更多信息:
$ make VERBOSE=1
/usr/bin/cmake.exe -H/cygdrive/e/Projects/MyProject/Sources -B/cygdrive/e/Projects/MyProject/Build_Cygwin --check-build-system CMakeFiles/Makefile.cmake 0
Re-run cmake: build system dependency is missing
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
按照 Fred 的建议,我使用 --trace
来获取更多信息 --> 在 Configuring done
之后完全没有任何信息。
然后,按照 Tsyvarev 的建议,我将 CMakeLists 简化到最低限度,这样就可以了。然后我一点一点地添加东西,直到我发现问题。
它来自包含驱动器号(如 "E:/...")的 cmake 路径变量,这使得 cmake 发疯并卡住。
我做了一个小宏来修补所有路径变量,将驱动器号替换为“/cygdrive/[驱动器号]/...”,在全部修补后,一切恢复正常。有兴趣者:
macro(PatchPath PATHTOPATCH OUTPUT_VAR)
if(${TARGET_SYSTEM_TYPE} MATCHES "cygwin")
string(SUBSTRING ${PATHTOPATCH} 0 1 CYG_DRIVE)
string(TOLOWER ${CYG_DRIVE} CYG_DRIVE)
string(SUBSTRING ${PATHTOPATCH} 2 -1 TMP_END_OF_PATH)
set(${OUTPUT_VAR} "/cygdrive/${CYG_DRIVE}${TMP_END_OF_PATH}")
endif()
endmacro()
谢谢大家!
我有一个以前 linux 只在 makefile 中的项目。
我已经成功地将它迁移到 cmake 并且工作正常,它在纯 linux (makefile --> so) 和纯 windows (visual studio --> dll 中编译) 没有问题。它还在 linux 上为 windows 编译得很好(使用 mingw --> dll)。
但是,对于集成和脚本兼容性问题,我必须为 windows (dll) 生成和构建代码,但是在 cygwin 环境中(cygwin 的 gcc 提供了一个 dll),就像使用的旧 makefile去做。 (由于外部限制,我必须这样做)
我已经在我的 cygwin 上安装了 "make" 和 "cmake" 包。
当我尝试在 cygwin 控制台中生成 makefile 时,它卡住了:
$ cmake -G "Unix Makefiles" ../Sources
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
当我停止它 (ctrl-C) 时,它什么也没说,"Makefile" 文件出现在我的构建目录中,所以我尝试编译它:
$ make
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
它似乎又重新生成了(我再次打印了我的 cmake,Makefile 文件消失然后重新出现,命令再次卡在同一阶段)。
这一次,当我停止它时,它会打印以下消息:
$ make
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
make: *** [Makefile:224: cmake_check_build_system] Interrupt
我试图查找 Makefile,似乎是以下命令阻塞了:
cmake_check_build_system:
$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check- build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system
我搜索了一下,找到了
$ cmake -H../Sources -B. --check-build-system CMakeFiles/Makefile.cmake 0
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
我不知道自己做错了什么,我被卡住了,有人可以帮助我吗?
编辑:运行 make in verbose mode 提供更多信息:
$ make VERBOSE=1
/usr/bin/cmake.exe -H/cygdrive/e/Projects/MyProject/Sources -B/cygdrive/e/Projects/MyProject/Build_Cygwin --check-build-system CMakeFiles/Makefile.cmake 0
Re-run cmake: build system dependency is missing
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
按照 Fred 的建议,我使用 --trace
来获取更多信息 --> 在 Configuring done
之后完全没有任何信息。
然后,按照 Tsyvarev 的建议,我将 CMakeLists 简化到最低限度,这样就可以了。然后我一点一点地添加东西,直到我发现问题。
它来自包含驱动器号(如 "E:/...")的 cmake 路径变量,这使得 cmake 发疯并卡住。
我做了一个小宏来修补所有路径变量,将驱动器号替换为“/cygdrive/[驱动器号]/...”,在全部修补后,一切恢复正常。有兴趣者:
macro(PatchPath PATHTOPATCH OUTPUT_VAR)
if(${TARGET_SYSTEM_TYPE} MATCHES "cygwin")
string(SUBSTRING ${PATHTOPATCH} 0 1 CYG_DRIVE)
string(TOLOWER ${CYG_DRIVE} CYG_DRIVE)
string(SUBSTRING ${PATHTOPATCH} 2 -1 TMP_END_OF_PATH)
set(${OUTPUT_VAR} "/cygdrive/${CYG_DRIVE}${TMP_END_OF_PATH}")
endif()
endmacro()
谢谢大家!