lnk1104:无法打开文件'libpng.lib',但'libpng.lib'是输出,而不是input

我试图build立libpng-1.16.6作为VS 2010的静态库。我想我已经排除了makefile语法问题,文件系统权限和不正确的LIB / LIBPATH环境variables。 生成文件是与lpng1616一起交付的不变的makefile.vcwin32。 我确定这个问题是环境问题,但是对于这个问题,我们还是没有什么想法。 我正在寻找新的想法! TIA寻求帮助。

相关事实:

  1. 整体模式是相同的,我用来构buildgeos,gdal和wxWidgets开源项目:Visual Studio makefile项目调用Windows命令文件。 Windows命令文件执行任何所需的预处理,调用vcvarsall.bar来设置VS构build环境,调用nmake,并执行任何所需的后处理。 命令文件在很大程度上是相同的,但是为每个项目定制。 每种情况下的makefile都是与源代码一起提供的。 我的wxWidgets构build成功的重新testingcertificate,我的计算机上没有环境变化导致libpng失败。
  2. 感兴趣的日志输出是:lib -nologo -out:libpng.lib png.obj pngerror.obj pngget.obj pngmem.obj pngpread.obj pngread.obj pngrio.obj pngrtran.obj pngrutil.obj pngset.obj pngtrans.obj pngwio .obj pngwrite.obj pngwtran.obj pngwutil.obj LINK:致命错误LNK1104:无法打开文件'libpng.lib'NMAKE:致命错误U1077:'“c:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ BIN \ amd64 \ lib.EXE“':返回码'0x450'
  3. 日志输出说明:要求Lib.exe从对象文件列表中生成libpng.lib。 错误是输出文件无法打开。 在执行makefile的这一刻,所有的目标文件都已经生成,我已经确认了。 该库将被写入与目标文件相同的目录中。
  4. 由于编译器能够编写目标文件,因此在此目录中不会有写入权限问题。
  5. 启动一个VS命令提示符窗口,浏览到这个path并执行相同的'lib'命令行,makefile执行成功。 因此不能有命令行语法错误。 从同一个VS命令提示符运行Windows命令文件中的nmake也会成功。
  6. 执行makefile后立即将“lib”commandl行添加到Windows命令文件中,结果与从makefile运行时相同的错误。
  7. 自然的结论是,问题是lib.exe正在执行的环境。
  8. Googlesearch结果,search'lib','link','lnk1104','0x450','nmake','makefile','makefile.vcwin32','在命令行而不是makefile'等等的组合。 ,揭示了几种模式。 正如人们所期望的那样,最常见的问题是其中一个input文件丢失或无效。 (请参阅上面的3,4,5和6)。我没有注意到在错误消息中引用的文件实际上是输出文件而不是input文件的情况。 LIB或LIBPATH环境variables有问题的另一个常见问题。 (我已经检查了这些,将VS命令提示符值与我的工作stream程中的值进行比较。)
  9. 我发现,显然lib.exe会将其输出写入默认的输出名称,并重命名为“-out”选项所请求的名称。 如果生成文件被更改为生成“tmplibpng.lib”而不是“libpng.lib”,则会生成相同的错误消息。

我以为我是安全的。 在编写Windows命令文件时,我使用下划线字符前后缀所有“内部”环境变量以避免冲突,例如“ LIB ”。 显然' LIB '正在被lib.exe使用,尽管它不在微软公布的列表中。 重命名这个环境变量解决了我的问题。