2013-08-25 4 views
2

Qt를 처음 사용하고 Qt로 기본 gstreamermm 예제를 실행하려고합니다. qt의 main.cpp에 gstreamermm.h를 포함 시키면 컴파일 오류가 발생합니다. 나는 그 오류가 무엇을 말하는지 이해할 수 없다. 이 예제에서는 Qt 생성자를 사용하고 있습니다.gstreamermm 및 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 

어떤 도움을 다음 얻을.

답변

5

Qt가 Q_FOREACH의 줄임말로 foreach 매크로를 정의하기 때문에 오류가 나타납니다. 이는 몇 가지 gstreamermm 클래스에서 foreach 메소드 선언과 충돌합니다.

  1. 이 Qt는 프로젝트 파일에 CONFIG += no_keywords 줄을 추가

    이 문제를 방지 할 수있는 몇 가지 방법이 있습니다. 예를 들어 다음과 같은 Qt 전용 키워드를 사용할 수 없습니다. signalsslots. QtCreator에 의해 자동 생성 되었기 때문에 이미 사용하고 있다면 Q_SIGNALSQ_SLOTS 매크로로 대체 할 수 있습니다.

  2. gstreamermm.h을 Qt 헤더 앞에 넣어서 헤더 포함 순서를 변경하십시오.

  3. gstreamermm.h을 포함하기 전에 Qt 헤더를 포함시킨 후 #undef foreach을 넣습니다.

2와 3은 헤더 포함의 순서가 잘 작성된 라이브러리를 사용하는 잘 작성된 응용 프로그램에서 문제가되지해야 하나 어떤 #define s 또는 #undef Ines는 소개 안하기 때문에, 훨씬 덜 우아한 솔루션있는 사용 된 라이브러리의 문서에 명시 적으로 명시되지 않는 한 포함 된 선언에 영향을줍니다. ../untitled/mainwindow.h:18:9 : 오류 : 예상 이제

+0

내가 파일에서 컴파일 오류 다음 리스팅 ../untitled/main.cpp:1:0에서 포함 ':' '전 슬롯 ' ../untitled/mainwindow.h:18:9 : 오류 :'slots '은 유형을 지정하지 않습니다. make : *** [main.o] 오류 1 – sap

+1

맞아요 -'no_keywords' 수 있습니다 기존 코드를 해독하십시오. 이것을 피하려면'slots'을'Q_SLOTS'로 변경하십시오. 이 발언을 포함하도록 답변을 업데이트했습니다. –

+0

그게 효과가! 감사. 그러나 나는 그 문제가 무엇인지를 정말로 이해할 수 없다. – sap