我正在尝试将 libpng-1.16.6 构建为 VS 2010 的静态库。我想我已经排除了 makefile 语法问题、文件系统权限和不正确的 LIB/LIBPATH 环境变量。 makefile 是未更改的 makefile.vcwin32 随 lpng1616 一起交付。我确定问题是环境问题,但我不知道它是什么。我正在寻找新的想法! TIA 寻求任何帮助。
相关事实:
- 总体模式与我用于构建 geos、gdal 和 wxWidgets 开源项目的模式相同:Visual Studio 生成文件项目调用 Windows 命令文件。 Windows 命令文件执行任何所需的预处理,调用 vcvarsall.bar 来设置 VS 构建环境,调用 nmake,并执行任何所需的后处理。命令文件在很大程度上是相同的,但针对每个项目进行了自定义。每种情况下的 makefile 都是与源代码一起提供的。成功重新测试我的 wxWidgets 构建证明我的计算机上没有环境变化导致 libpng 失败。
- 感兴趣的日志输出是: 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: fatal error LNK1104:无法打开文件“libpng.lib” NMAKE: fatal error U1077:'"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\amd64\lib.EXE"':返回代码'0x450'
- 日志输出说明:要求 Lib.exe 从目标文件列表中生成 libpng.lib。错误是无法打开输出文件。此时,在执行 makefile 时,所有目标文件都已生成,我已确认存在这些文件。该库将被写入与目标文件相同的目录中。
- 由于编译器能够写入目标文件,因此在此目录中不存在写入权限问题。
- 启动 VS 命令提示符窗口,导航到此路径并执行 makefile 正在成功执行的相同“lib”命令行。因此不可能有命令行语法错误。从同一 VS 命令提示符运行 Windows 命令文件中的 nmake 也成功。
- 在执行 makefile 后立即将“lib”命令行添加到 Windows 命令文件会导致与从 makefile 运行时相同的错误。
- 自然而然的结论是,问题在于 lib.exe 的执行环境。
- Google 结果,搜索“lib”、“link”、“lnk1104”、“0x450”、“nmake”、“makefile”、“makefile.vcwin32”、“在命令行中工作,而不是在 makefile 中工作”的组合等,揭示了几种模式。正如人们所预料的那样,最常见的问题是其中一个输入文件丢失或无效。 (参见上面的 3、4、5 和 6。)我没有注意到错误消息中引用的文件实际上是输出文件而不是输入文件的情况。另一个常见问题是 LIB 或 LIBPATH 环境变量有问题。 (我检查了这些,将 VS 命令提示值与我的工作流程中的值进行了比较。)
- 我发现显然 lib.exe 将其输出写入默认输出名称并重命名为“-out”选项请求的名称。如果 makefile 被更改为构建“tmplibpng.lib”而不是“libpng.lib”,则会生成相同的错误消息。
最佳答案
我以为我很安全。在编写 Windows 命令文件时,我为所有“内部”环境变量添加前缀和后缀,以避免冲突,例如“LIB”。显然 'LIB' 正在被 lib.exe 使用,尽管它不在 Microsoft 发布的列表中。重命名此环境变量解决了我的问题。
关于windows - lnk1104 : cannot open file 'libpng.lib' , 但 'libpng.lib' 是输出,不是输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098007/