gstreamermm和Qt编译错误

时间:2013-08-25 00:12:47

标签: c++ qt gstreamer qtgstreamer

我是Qt的新手,我正在尝试用Qt运行基本的gstreamermm示例。当我在qt的main.cpp中包含gstreamermm.h时,我得到编译错误。我无法理解这个错误说的是什么。我在这个例子中使用Qt创建者。

#include <QApplication>
#include <gstreamermm.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

我收到以下编译错误

g++ -c -pipe -g -pthread -Wall -W -D_REENTRANT -fPIE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../../../Qt5.1.0/5.1.0/gcc_64/mkspecs/linux-g++ -I../PlayerBasic -I/usr/include/giomm-2.4 -I/usr/lib/x86_64-linux-gnu/giomm-2.4/include -I/usr/include/gstreamer-0.10 -I/usr/include/glibmm-2.4 -I/usr/lib/x86_64-linux-gnu/glibmm-2.4/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/sigc++-2.0 -I/usr/lib/x86_64-linux-gnu/sigc++-2.0/include -I/usr/include/libxml2 -I/usr/include/gstreamermm-0.10 -I/usr/lib/gstreamermm-0.10/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I../../../../Qt5.1.0/5.1.0/gcc_64/include -I../../../../Qt5.1.0/5.1.0/gcc_64/include/QtWidgets -I../../../../Qt5.1.0/5.1.0/gcc_64/include/QtGui -I../../../../Qt5.1.0/5.1.0/gcc_64/include/QtCore -I. -I. -I. -o main.o ../PlayerBasic/main.cpp
In file included from /usr/include/glibmm-2.4/glibmm.h:92:0,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/glibmm-2.4/glibmm/balancedtree.h:225:40: error: macro "Q_FOREACH" requires 2 arguments, but only 1 given
In file included from /usr/include/gstreamermm-0.10/gstreamermm/query.h:30:0,
                 from /usr/include/gstreamermm-0.10/gstreamermm/message.h:33,
                 from /usr/include/gstreamermm-0.10/gstreamermm/element.h:34,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:28,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/gstreamermm-0.10/gstreamermm/structure.h:358:39: error: macro "Q_FOREACH" requires 2 arguments, but only 1 given
In file included from /usr/include/gstreamermm-0.10/gstreamermm.h:67:0,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/gstreamermm-0.10/gstreamermm/bufferlist.h:189:39: error: macro "Q_FOREACH" requires 2 arguments, but only 1 given
In file included from /usr/include/gstreamermm-0.10/gstreamermm.h:98:0,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/gstreamermm-0.10/gstreamermm/taglist.h:597:39: error: macro "Q_FOREACH" requires 2 arguments, but only 1 given
In file included from /usr/include/sigc++-2.0/sigc++/signal.h:8:0,
                 from /usr/include/sigc++-2.0/sigc++/sigc++.h:80,
                 from /usr/include/glibmm-2.4/glibmm/thread.h:58,
                 from /usr/include/glibmm-2.4/glibmm.h:87,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/sigc++-2.0/sigc++/signal_base.h: In constructor 'sigc::internal::temp_slot_list::temp_slot_list(sigc::internal::temp_slot_list::slot_list&)':
/usr/include/sigc++-2.0/sigc++/signal_base.h:181:50: error: value-initialization of reference type 'sigc::internal::temp_slot_list::slot_list& {aka std::list<sigc::slot_base>&}'
In file included from /usr/include/sigc++-2.0/sigc++/sigc++.h:80:0,
                 from /usr/include/glibmm-2.4/glibmm/thread.h:58,
                 from /usr/include/glibmm-2.4/glibmm.h:87,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/sigc++-2.0/sigc++/signal.h: At global scope:
/usr/include/sigc++-2.0/sigc++/signal.h:617:44: error: ISO C++ forbids declaration of 'result_type' with no type [-fpermissive]
/usr/include/sigc++-2.0/sigc++/signal.h:630:5: error: 'static int sigc::internal::signal_emit0<T_return, T_accumulator>::result_type(sigc::internal::signal_impl*)' conflicts with a previous declaration
/usr/include/sigc++-2.0/sigc++/signal.h:598:47: note: previous declaration 'typedef typename T_accumulator::result_type sigc::internal::signal_emit0<T_return, T_accumulator>::result_type'
/usr/include/sigc++-2.0/sigc++/signal.h: In static member function 'static int sigc::internal::signal_emit0<T_return, T_accumulator>::result_type(sigc::internal::signal_impl*)':
/usr/include/sigc++-2.0/sigc++/signal.h:628:48: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:628:54: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:629:48: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:629:54: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h: In static member function 'static sigc::internal::signal_emit0<T_return, T_accumulator>::result_type sigc::internal::signal_emit0<T_return, T_accumulator>::emit_reverse(sigc::internal::signal_impl*)':
/usr/include/sigc++-2.0/sigc++/signal.h:647:56: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:647:62: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:648:56: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:648:62: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h: At global scope:
/usr/include/sigc++-2.0/sigc++/signal.h:672:44: error: ISO C++ forbids declaration of 'result_type' with no type [-fpermissive]
In file included from /usr/include/sigc++-2.0/sigc++/sigc++.h:80:0,
                 from /usr/include/glibmm-2.4/glibmm/thread.h:58,
                 from /usr/include/glibmm-2.4/glibmm.h:87,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/sigc++-2.0/sigc++/signal.h:701:5: error: 'static int sigc::internal::signal_emit0<T_return, sigc::nil>::result_type(sigc::internal::signal_impl*)' conflicts with a previous declaration
In file included from /usr/include/sigc++-2.0/sigc++/sigc++.h:80:0,
                 from /usr/include/glibmm-2.4/glibmm/thread.h:58,
                 from /usr/include/glibmm-2.4/glibmm.h:87,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/sigc++-2.0/sigc++/signal.h:661:20: note: previous declaration 'typedef T_return sigc::internal::signal_emit0<T_return, sigc::nil>::result_type'
/usr/include/sigc++-2.0/sigc++/signal.h: In static member function 'static int sigc::internal::signal_emit0<T_return, sigc::nil>::result_type(sigc::internal::signal_impl*)':
/usr/include/sigc++-2.0/sigc++/signal.h:684:33: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:685:27: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:688:24: error: expected primary-expression before '.' token
In file included from /usr/include/sigc++-2.0/sigc++/sigc++.h:80:0,
                 from /usr/include/glibmm-2.4/glibmm/thread.h:58,
                 from /usr/include/glibmm-2.4/glibmm.h:87,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/sigc++-2.0/sigc++/signal.h:692:31: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h: In static member function 'static sigc::internal::signal_emit0<T_return, sigc::nil>::result_type sigc::internal::signal_emit0<T_return, sigc::nil>::emit_reverse(sigc::internal::signal_impl*)':
/usr/include/sigc++-2.0/sigc++/signal.h:728:39: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:729:43: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:729:49: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:732:40: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:732:46: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h:736:47: error: expected primary-expression before '(' token
/usr/include/sigc++-2.0/sigc++/signal.h:736:53: error: expected primary-expression before '.' token
/usr/include/sigc++-2.0/sigc++/signal.h: At global scope:
/usr/include/sigc++-2.0/sigc++/signal.h:766:38: error: expected ')' before '*' token
In file included from /usr/include/glibmm-2.4/glibmm/value_custom.h:32:0,
                 from /usr/include/glibmm-2.4/glibmm/value.h:196,
                 from /usr/include/glibmm-2.4/glibmm/propertyproxy_base.h:25,
                 from /usr/include/glibmm-2.4/glibmm/propertyproxy.h:25,
                 from /usr/include/glibmm-2.4/glibmm/objectbase.h:24,
                 from /usr/include/glibmm-2.4/glibmm/wrap.h:26,
                 from /usr/include/glibmm-2.4/glibmm/containerhandle_shared.h:25,
                 from /usr/include/glibmm-2.4/glibmm/arrayhandle.h:23,
                 from /usr/include/glibmm-2.4/glibmm.h:91,
                 from /usr/include/gstreamermm-0.10/gstreamermm/bin.h:7,
                 from /usr/include/gstreamermm-0.10/gstreamermm.h:65,
                 from ../PlayerBasic/main.cpp:3:
/usr/include/c++/4.7/typeinfo:41:37: error: expected '}' before end of line
/usr/include/c++/4.7/typeinfo:41:37: error: expected unqualified-id before end of line
/usr/include/c++/4.7/typeinfo:41:37: error: expected '}' before end of line
/usr/include/c++/4.7/typeinfo:41:37: error: expected '}' before end of line
/usr/include/c++/4.7/typeinfo:41:37: error: expected declaration before end of line
make: *** [main.o] Error 1

对此有任何帮助非常感谢。

1 个答案:

答案 0 :(得分:5)

出现错误是因为Qt将foreach宏定义为Q_FOREACH的简写。这与几个gstreamermm类中foreach方法的声明相冲突。

有几种方法可以避免这个问题:

  1. CONFIG += no_keywords行添加到您的Qt项目文件中。请注意,您将无法使用特定于Qt的关键字,例如signalsslots。如果您已经使用它们(例如,因为它们是由QtCreator自动生成的),您可以使用Q_SIGNALSQ_SLOTS宏替换它们。

  2. gstreamermm.h放在Qt标题之前,更改标题包含的顺序。

  3. 在包含Qt标题之后但在包含#undef foreach之前添加gstreamermm.h

  4. 2和3是不太优雅的解决方案,因为在包含编写良好的库的良好编写的应用程序中,包含头的顺序无关紧要,并且不应引入任何#define或{{1除非由使用过的库的文档明确指定,否则会影响包含的声明。