使用CMake和NMake构建OpenCV 3.0时出现链接错误

4
尝试使用以下命令通过CMake和NMake构建OpenCV 3.0: cmake -DCMAKE_BUILD_TYPE=release -G "NMake Makefiles" -DBUILD_SHARED_LIBS=OFF -DBUILD_opencv_java=OFF -DWITH_MSMF=OFF -DWITH_DSHOW=OFF -DWITH_VFW=OFF DWITH_OPENEXR=OFF -DWITH_CUDA=OFF .. 然后执行以下命令: nmake 如果出现以下错误:
...
-- Configuring done
-- Generating done
-- Build files have been written to: W:/VSONLINE/Passport-Photo/thirdparty/openc
v-3.0.0/build
nmake

Microsoft (R) Program Maintenance Utility Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Scanning dependencies of target zlib
[  0%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/adler32.c.obj
adler32.c
[  0%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/compress.c.obj
compress.c
[  0%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/crc32.c.obj
crc32.c
[  0%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/deflate.c.obj
deflate.c
[  0%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/gzclose.c.obj
gzclose.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/gzlib.c.obj
gzlib.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/gzread.c.obj
gzread.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/gzwrite.c.obj
gzwrite.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/inflate.c.obj
inflate.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/infback.c.obj
infback.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/inftrees.c.obj
inftrees.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/inffast.c.obj
inffast.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/trees.c.obj
trees.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/uncompr.c.obj
uncompr.c
[  1%] Building C object 3rdparty/zlib/CMakeFiles/zlib.dir/zutil.c.obj
zutil.c
[  2%] Linking C static library ..\lib\zlib.lib
The system cannot find the path specified.
NMAKE : fatal error U1077: 'cd' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0
\VC\BIN\nmake.exe"' : return code '0x2'

我做错了什么?我已经尝试使用Visual Studio 2010和2013,但结果完全相同。

更新 如果我将生成器更改为“Visual Studio 10 2010”或任何其他版本的Visual Studio,然后使用msbuild.exe OpenCV.sln构建,那么所有内容都会成功构建。这是nmakecmake中的问题吗?

2个回答

3

显然,这是一个已知的错误(问题 5496),已被标记为wontfix。在评论中,用户MarianMMX提出了以下解决方法:

  1. Open CMakeLists.txt .
  2. Go to line 70. (Note: it's line 90 in my case, so better do a text search)
  3. Comment (or delete):

    #if(MSVC)
    # set(CMAKE_USE_RELATIVE_PATHS ON CACHE INTERNAL "" FORCE)
    #endif()
    
  4. Delete the generated files and rerun cmake.

我已经成功地使用nmake(VS2010和VS2013)编译了OpenCV 3.0.0,在应用上述解决方法之后:

> cmake -G"NMake Makefiles" <other options> <opencv src dir>
...
> nmake
...

2

这不是答案,只是我所做的一些调试工作。问题不在于链接,而在于堆积的cd命令。我还没有找到这些命令在CMake脚本中的位置,但某个地方出了问题。如果你使用以下命令运行CMake配置步骤:

 -DCMAKE_VERBOSE_MAKEFILE=true

然后你会看到如下输出:
[ 2%] 链接 C 静态库 ..\lib\zlib.lib cd 3rdparty\zlib C:\Users\builder\Miniconda2\envs\_build\Library\bin\cmake.exe -P CMakeFiles\zlib.dir\cmake_clean_target.cmake cd ..\.. cd 3rdparty\zlib 系统找不到指定的路径。
最后一行 `cd` 命令非常可疑,你不能不使用某个连接字符就将两个 `cd` 命令链接起来。这里出现了一些问题,可能是由于 OpenCV 源代码或 CMake 的原因,NMake 生成器出错了。
如果您深入查看 `build/3rdparty/zlib/CMakeFiles/zlib.dir/build.make` 文件,您会发现其中的原因:所有的 `cd ..\..\` 命令都有一个额外的斜杠,我认为在行末处是行续,而不是路径结束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接