2017-04-20 2 views
1

Beim Erstellen meines Projekts erhalte ich die folgende Fehlermeldung. Leider kann ich keinen Sinn daraus machen.Linker Mehrfachdefinitionsfehler: Warum scheint <thread> meine Funktionen zu definieren?

CMakeFiles/xxx.dir/xxx/send_dummy_events.cc.o: In function `std::chrono::duration_values<long>::zero()': 
/usr/include/c++/6/thread:311: multiple definition of `POLONAISE::xxx::dispatch_event(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
CMakeFiles/xxx.dir/xxx/main.cc.o:/home/manuel/projects/projectname/build_x86_64/package/xxx/send_dummy_events.cc:10: first defined here 

CMakeFiles/xxx.dir/xxx/send_dummy_events.cc.o: In function `std::chrono::duration<long, std::ratio<1l, 1000000000l> >::count() const': 
/usr/include/c++/6/thread:311: multiple definition of `POLONAISE::xxx::send_dummy_events()' 
CMakeFiles/xxx.dir/xxx/main.cc.o:/home/manuel/projects/projectname/build_x86_64/package/xxx/send_dummy_events.cc:16: first defined here 

Mir scheint dies als /usr/include/c++/6/thread würde meine Funktionsnamen dispatch_event() und send_dummy-event() neu definieren.

Die Quelle meiner send_dummy_events.cc ist dies:

#include <chrono> 
#include <thread> 
#include "POLONAISE/logging.h" 
#include "POLONAISE/EventQueue.h" 


namespace POLONAISE { 
    namespace xxx { 
     void dispatch_event(std::string serialized_uirequest __attribute__((unused))) 
     { 

     }   


     void send_dummy_events() 
     { 
      std::chrono::seconds delay(3); 
      while (1) { 
        std::this_thread::sleep_for(delay); 
      } 
     } 
    } 
} 

Die Quelle usr/include/c++/6/thread ist dies: (Sie, nicht durch die Zeilennummern verwechselt werden habe ich vergessen, wie sie in Vim auszuschalten.)

 /// sleep_for 
    2  template<typename _Rep, typename _Period> 
    1  inline void 
311  sleep_for(const chrono::duration<_Rep, _Period>& __rtime) 
    1  { 
    2   if (__rtime <= __rtime.zero()) 
    3   return; 
    4   auto __s = chrono::duration_cast<chrono::seconds>(__rtime); 
    5   auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s); 
    6 #ifdef _GLIBCXX_USE_NANOSLEEP 
    7   __gthread_time_t __ts = 
    8   { 
    9    static_cast<std::time_t>(__s.count()), 
10    static_cast<long>(__ns.count()) 
11   }; 
12   while (::nanosleep(&__ts, &__ts) == -1 && errno == EINTR) 
13   { } 
14 #else 
15   __sleep_for(__s, __ns); 
16 #endif 
17  } 
+0

Mehrere Definitionsfehler bedeuten normalerweise, dass Sie Code in einer Header-Datei definiert haben, die keine Wächter enthält, oder Sie fügen eine Quelldatei in eine andere Datei ein. – NathanOliver

+0

@NathanOliver Include Guards hilft nicht, wenn die Header-Datei in verschiedenen Quelldateien enthalten ist. –

+1

@Someprogrammerdude Wahr, aber es tut nicht weh, sie zu haben, für den Fall, dass sie in die Kette eingeschlossen sind, ohne zu merken, dass sie es sind. – NathanOliver

Antwort

0

fand ich den Grund und jetzt bin meine eigene Frage zu beantworten:

die Ursache Wurzel war, dass ich #include in main.cc d send_dummy_events.cc. Da dies nur ein temporärer Teststummel war, sah ich vor einigen Wochen kein Problem darin. Aber jetzt habe ich meinen vorhandenen Code für einen neuen Teil der Anwendung dupliziert, und beim Aktualisieren der CMakeLists.txt habe ich einfach sichergestellt, dass dort alle Quelldateien notiert sind. Also habe ich send_dummy_events.cc hinzugefügt.

Voilà, als der Linker jetzt zweimal die gleichen Symbole bekam, beschwerte er sich zu Recht.

Nun habe ich gehört, dass es sogar eine Regel dazu gibt: Niemals Quelldateien einbinden. Nun, ich weiß, warum.

Ich bin immer noch verwirrt, warum die Fehlermeldung liest, als ob die zweite Definition würde in /usr/include/c++/6/thread auftreten, aber ich denke, das ist nur eine weitere "verwirrende Fehlermeldung ™" GCC bekannt ist.

Verwandte Themen