使用 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 命令行构建项目

使用命令行创建新的 Visual Studio 模板项目

Visual Studio 2019:使用 vcvars64.bat 从命令行构建 C++ 不再起作用

Visual Studio 2012 命令行内置

通过命令行构建 Visual Studio 项目

.Net Core Visual Studio 项目命令行构建与右键构建相同