使用 Visual Studio 9 构建的命令行应用程序不会将 *.NEF 作为输入,而使用 gcc 构建的相同应用程序会 - 为啥?
Posted
技术标签:
【中文标题】使用 Visual Studio 9 构建的命令行应用程序不会将 *.NEF 作为输入,而使用 gcc 构建的相同应用程序会 - 为啥?【英文标题】:Commandline app built with visual studio 9 does not take *.NEF as input while same app built with gcc does - why?使用 Visual Studio 9 构建的命令行应用程序不会将 *.NEF 作为输入,而使用 gcc 构建的相同应用程序会 - 为什么? 【发布时间】:2011-03-17 23:19:51 【问题描述】:我之前使用 cygwin / gcc 构建了 dcraw.c (http://www.cybercom.net/~dcoffin/dcraw/dcraw.c) 作为 Windows 命令行应用程序。今天我用 Visual Studio 2008 构建了它,因为它允许将库 LIBJPEG 和 LCMS 包含到 exe 文件中,并且也不需要 cygwin1.dll。此外,VC 构建的版本似乎更快。前奏就这么多。
实际的问题是:当我使用最终应用程序时,如 dcraw -T -4 *.NEF cygwin / gcc 构建的版本将处理我目录中的所有 NEF 文件,而 Visual Studio 构建的版本会显示:*.NEF: Invalid argument
我不知道为什么会这样,并且正在寻找解决此问题的方法。任何帮助将不胜感激。
【问题讨论】:
处理单个文件当然与任一版本相同 这是 *nix shell 扩展文件名通配符。它与编译器无关。 @Bo 在这种情况下,并不是两个程序都是 Windows 程序,并且都从同一个 shell 运行 - windows cmd 提示符。 【参考方案1】:我相信您需要添加setargv.obj
才能链接。它将扩展通配符。如果您使用的是命令行(cl.exe),您可以在命令行中指定它:
cl yourfile.c /link setargv.obj
在 Visual Studio 项目中,您可以将其添加到项目属性中链接器输入选项的附加依赖项字段中。
【讨论】:
感谢您为我指明这个方向。我尝试将它添加到附加依赖项选项卡,但到目前为止它没有成功。所以我会用谷歌搜索更多的 setargv.obj 我想我正确地包含了 setargv.obj - 就像你说的那样,但它不起作用。是否需要更改 int CLASS main (int argc, const char **argv) 才能解决?这是 dcraw.c 中的第 8613 行,链接到上面。 我最近遇到了这个问题,但只需在链接器的“附加依赖项”字段中包含setargv.obj
就足以让它为我工作。我不必将参数更改为 main。不知道你的情况有什么不同(除了我使用的是 VC2005)
@Qwerty:我刚刚在 VS2009 中尝试过(我认为是 VS9 ......我很难记住版本)并且它有效。我稍微查看了那个源文件,没有看到任何明显会导致问题的东西。看来 CLASS 是一个空定义。我在我的小测试应用程序中尝试了完全相同的声明,一切都按预期工作。所以我很难过。查看“命令行”下的 VS 链接器属性。 setargv.obj 是否出现在一堆 .lib 文件的前面?
@Qwerty:作为健全性检查,您可以使用 "int i; for (i=0;i【参考方案2】:
您是否从同一类型的命令解释器运行两个构建?在 Unix 系统上,shell 扩展通配符; Windows cmd.exe
没有,如有必要,留给程序去做。如果您从 cmd
运行一个构建,而从 Cygwin 的 bash
运行另一个构建,则可以解释不同的行为。
【讨论】:
两者都不是从普通的 Windows 命令窗口运行的——实际上是由同一个 *.bat 文件调用的。以上是关于使用 Visual Studio 9 构建的命令行应用程序不会将 *.NEF 作为输入,而使用 gcc 构建的相同应用程序会 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
swig 和使用 Visual Studio 2017 命令行构建项目