Qt Creator编译错误:"::swprintf和::vswprintf未声明"

10

目前为止,我已经在Visual Studio中编写了所有的代码,现在我需要为其添加一些用户界面,因此我将使用Qt。因此,我将我的项目中的每个文件(除了主类)都添加了进来,然后尝试使用Qt编译它。由于我使用了一些C++0x特性,所以我不得不在项目文件中添加了这一行:

QMAKE_CXXFLAGS += -std=c++0x

然后我尝试编译它,只出现了两个错误(可能还有更多,但编译器停在了这两个错误上)。

In file included from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/postypes.h:42,

                 from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iosfwd:42,

                 from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ios:39,

                 from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ostream:40,

                 from ../TranslatorBase/ttObject.h:5,

                 from ../TranslatorBase/ttArray.h:5,

                 from ../TranslatorBase/ttArray.cpp:1:

d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf' has not been declared

d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprintf' has not been declared

我不知道为什么会出现这样的错误。为了确保,我首先尝试使用cygwin/gcc编译同一项目,命令如下:

gcc -std=c++0x TranslatorBase/ttArray.cpp -c -o ttArray.o

代码没有错误,甚至没有任何警告就编译通过了。事实上,我的项目中的每个文件都没有任何警告。

我现在正在使用基于Qt v4.7.0的Qt Creator v2.0.1,它使用mingw / gcc v4.4.0。

- 编辑 -

我发现了一个新的问题,即使没有我的源文件(只有Qt生成的文件),仍然存在编译错误。看起来我的gcc有问题。

@Troubadour Qt 生成了以下命令:

g++ -c -std=c++0x -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I'd:/Qt/qt/include/QtCore' -I'd:/Qt/qt/include/QtGui' -I'd:/Qt/qt/include' -I'd:/Qt/qt/include/ActiveQt' -I'debug' -I'.' -I'../TranslatorUI' -I'.' -I'd:/Qt/qt/mkspecs/win32-g++' -o debug/ttArray.o ../TranslatorBase/ttArray.cpp

“qmake” 生成的 “gcc” 构建命令是什么? - Troubadour
请注意,这个问题讨论了相同的问题,因此可能会有所帮助。尽管您没有显式使用-ansi选项,但可能是您看到了完全相同的情况,也可能不是。 - Troubadour
如果你在命令行中使用 g++ 而不是 gcc,它还能正常工作吗? - Troubadour
@Troubadour:看起来这里也有同样的问题,当你要求编译器使用c++0x std选项进行编译时,它也认为编译是受限于ansi的。所以我只是按照这个答案建议的去做了。但我不知道它是否会影响其他东西。 - Ali1S232
2个回答

11

如Troubadour所建议的那样,这是与mingw有关的问题。当您将-std=c++0x标志添加到编译选项时,mingw会自动添加-ansi标志。为了解决这个问题,我添加了-U__STRICT_ANSI__标志到编译选项中。问题已解决。


使用 -std=gnu++0x 甚至不需要取消定义 __STRICT_ANSI__。 - rezna
@rezna 这取决于你是否使用 Unicode 类型和函数(至少在我写这篇答案时是这样的)。-ansi 将删除对诸如 wstring、wprintf、wcout 等函数和类的支持... - Ali1S232
@rezna,这就是另一个答案所说的! - Ali1S232
当我使用MinGW构建VTK 5.8.0时,我遇到了同样的问题。使用那个标志就像魔法一样奏效。 - Adri C.S.

5
我曾遇到过同样的问题。将-std=c++0x更改为-std=gnu++0x也可以解决它。

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