CMake 3.8.0 在 makefile 中生成错误的 link 命令

CMake 3.8.0 generates wrong link command in makefiles

问题:

在我 运行 cmake 生成一个带有 STATIC 库的项目并成功完成后,ninja 和 mingw32-make 都无法在链接时建立它们的目标。对于 SHARED 库或可执行文件,同样的设置工作正常。我已经为 "Ninja" 和 "MinGW Makefiles" 生成器尝试了这个:

忍者输出:

[2/2] Linking CXX static library hello_wsl.lib
FAILED: hello_wsl.lib
cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E remove hello_wsl.lib && "" qc hello_wsl.lib  CMakeFiles/hello_wsl.dir/lib_hello_world.cpp.obj && cd ."
"""" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
ninja: build stopped: subcommand failed.

mingw32-make 输出:

Scanning dependencies of target hello_wsl
[ 50%] Building CXX object CMakeFiles/hello_wsl.dir/lib_hello_world.cpp.obj
[100%] Linking CXX static library hello_wsl.lib
Error running link command: El parámetro no es correcto
CMakeFiles\hello_wsl.dir\build.make:93: recipe for target 'hello_wsl.lib' failed
mingw32-make.exe[2]: *** [hello_wsl.lib] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/hello_wsl.dir/all' failed
mingw32-make.exe[1]: *** [CMakeFiles/hello_wsl.dir/all] Error 2
Makefile:82: recipe for target 'all' failed
mingw32-make.exe: *** [all] Error 2

也看看 "project_root\build\CMakeFiles\hello_wsl.dir\link.txt" 生成的 "MinGW Makefiles":

"" qc hello_wsl.lib  CMakeFiles/hello_wsl.dir/lib_hello_world.cpp.obj

示例项目,按步骤重现 "MinGW Makefiles" 的问题:


这是我发现的粗略 fix/workaround:


为了解决这个问题,我做了一些事情:

关于 CMAKE_ARCMAKE_RUNLIB 变量有一些具体说明:根据 bugreport 它们应该声明为 CACHED:

SET(CMAKE_AR      "$ENV{MINGW_W64_BIN_DIR}/ar.exe" CACHE FILEPATH "Arhiver")
SET(CMAKE_RANLIB  "$ENV{MINGW_W64_BIN_DIR}/ranlib.exe" CACHE FILEPATH "Runlib")