C ++ nedefinovaný reference při propojování

hlasů
3

Im přemýšlel, jestli by někdo být schopen mi pomoci, jak jsem byl poškrábání hlavu na dva dny na to.

Udělal jsem kompilaci a při pokusu o propojení zdrojový kód na linux stále nedefinovanou referenci

Kompilace použití,

g ++ -g -I / U01 / kasunt / Pracovní plocha / corelibCORBA / zahrnují -I / U01 / kasunt / Pracovní plocha / corelibCORBA / installed_components / zahrnují -I / U01 / kasunt / Pracovní plocha / corelibCORBA / idl -I / U01 / kasunt / Pracovní plocha / corelibCORBA / src / Server -I / U01 / kasunt / workspace / corelibCORBA / installed_components / idl -I / U01 / kasunt / workspace / corelibCORBA / installed_components / src / Server -I / U01 / kasunt / workspace / corelibCORBA / installed_components / imake - DNARROWPROTO -I. -I / U01 / kasunt / Pracovní plocha / corelibCORBA / installed_components / zahrnují -W -Wall -Wpointer-aritm -pipe -D_POSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS -g -O -I / U01 / kasunt / Pracovní plocha / corelibCORBA / zahrnují -g -O -I / U01 / kasunt / Pracovní plocha / corelibCORBA / zahrnují -fvisibility = skryté -fvisibility-inlines skryté -DACE_GCC_HAS_TEMPLATE_INSTANTIATION_VISIBILITY_ATTRS = 1 -W -Wall -Wpointer-aritm -ggdb -pipe -Wall -g -D__linux__ -D__x86__ -rdynamic -D_REENTRANT -DTAO_HAS_INTERCEPTORS = 0 -DTAO_HAS_VALUETYPE = 1 -D_REENTRANT -DACE_HAS_AIO_CALLS -D_GNU_SOURCE -I / usr / local / ACE + TAO + CIAO-5.7.9 / ACE_wrappers -I / usr / local / ACE + TAO + CIAO-5.7.9 / ACE_wrappers / TAO -I / usr / local / ACE + TAO + CIAO-5.7.9 / ACE_wrappers / TAO / orbsvcs -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -c -o TestSeqWrapper.o TestSeqWrapper.cpp

Propojení pomocí,

g ++ -o TestSeqWrapper TestSeqWrapper.o -g -L / U01 / kasunt / Pracovní plocha / corelibCORBA / lib -L / U01 / kasunt / Pracovní plocha / corelibCORBA / installed_components / lib -g -O -Wl, -E -L / usr / local /ACE+TAO+CIAO-5.7.9/ACE_wrappers/lib -L / usr / local / ACE + TAO + CIAO-5.7.9 / ACE_wrappers / lib -L / usr / local / ACE + TAO + CIAO-5.7.9 / ACE_wrappers / TAO / tao -L / U01 / kasunt / Pracovní plocha / corelibCORBA / installed_components / idl -lcorelibCORBA -lcorelibCORBA /u01/kasunt/workspace/corelibCORBA/installed_components/lib/corelibCORBA3r.lib / U01 / kasunt / Pracovní plocha / corelibCORBA / installed_components /lib/CorbaController3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/EConcurrency3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/corelibLogger3r.lib / U01 / kasunt / workspace / corelibCORBA / installed_components / lib /LeakTracker3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/trace3r.lib -lDefineTimeZone /u01/kasunt/workspace/corelibCORBA/installed_components/lib/timestamp3r.lib / U01 / kasunt / workspace / corelibCORBA / i nstalled_components / lib / ApplConfig3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/appl3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/logstream3r.lib / U01 / kasunt / Pracovní plocha / corelibCORBA / installed_components / lib / disklog3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/timeout3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/getpnam3r.lib / U01 / kasunt / workspace / corelibCORBA / installed_components / lib / config3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/strl3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/string3r.lib / U01 / kasunt / workspace / corelibCORBA / installed_components / lib / command3r. lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/cmdargs3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/CppUtils3r.lib /u01/kasunt/workspace/corelibCORBA/installed_components/lib/BuildTag3r.lib / U01 / kasunt / workspace / corelibCORBA / installed_components / lib / exception3r.lib -lCorbaIdl -lTAO_Valuetype -lTAO_PortableServer -lTAO_IORTable -lTAO_AnyTypeCode -lTAO_CosEvent -lTAO_CosNaming -lTAO -lACE

TestSeqWrapper.o: In function `SeqWrapper':
/u01/kasunt/workspace/corelibCORBA/include/corelibCORBA/SeqWrapper.hpp:165: undefined reference to `ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T()'

Dělat nm knihovny vidím výše uvedené konstruktor je zahrnuta v ceně,

nm --demangle ../installed_components/lib/libCorbaIdl.so | grep ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T
000327ba t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T(ECONZ::Corba::ComboElementSeq_T const&)
000331c2 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T(unsigned int)
0002edb0 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T(unsigned int, unsigned int, ECONZ::Corba::ComboElement_T*, bool)
0002d768 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T()
00032e52 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T(ECONZ::Corba::ComboElementSeq_T const&)
0003172a t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T(unsigned int)
0002d8e0 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T(unsigned int, unsigned int, ECONZ::Corba::ComboElement_T*, bool)
0002d8a6 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T()

Problematický řádek na zdrojový kód (řádek 165), SeqWrapper (): var_ (nový SequenceType), size_ (0) {}

Část kódu,

template< typename SEQUENCE >
class SeqWrapper : CppUtils::NonCopy
{
public:
   typedef SEQUENCE SequenceType;
   typedef typename SequenceType::_var_type SequenceType_var;

   typedef typename ElementTypeOf<SequenceType_var>::ElementType ElementType;
   typedef typename ElementTypeOf<SequenceType_var>::ReturnType ReturnType;
   typedef typename ElementTypeOf<SequenceType_var>::ConstReturnType ConstReturnType;

private:
   SequenceType_var var_;
   CORBA::ULong size_;

  void expand_( CORBA::ULong size )
  {
     // NOTE: current implementation assumes size only increases by small increments
     if (size > var_->length()) {
        var_->length( (size < 16)? 16 : (size > 256? size+256 : 2*size-2) );
     }
  }

public:
   SeqWrapper() : var_( new SequenceType ), size_( 0 ) { }
   SeqWrapper( CORBA::ULong reserve ) : var_( new SequenceType( reserve ) ), size_( 0 ) { var_->length( reserve ); }
   SeqWrapper( SequenceType *ownSeq ) : var_( ownSeq ), size_( ownSeq->length() ) { }

.....

Zdrojový kód TestSeqWrapper.cpp (Odstranil jsem většinu nechtěné věci, aby to méně matoucí)

#include <iostream>
#include <CppUtils/StringHelpers.hpp>
#include <corelibCORBA/SeqWrapper.hpp>
#include <CorbaC.h>

using namespace std;

int main()
{
    ECONZ::Corba::SeqWrapper< ECONZ::Corba::StringSeq_T > seq;
}

A vidíte, že jsem zadaný sdílenou knihovnu v možnostech odkazů (zobrazeno tučně). Původně jsem si myslel, že to může být způsobeno závislost nějakého druhu a pohyboval vlajku knihovny na začátku až žádný vliv.

Vážím si toho.

Položena 24/08/2010 v 08:03
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
1

Lidé,

Po 10 šálků kávy a pár téměř bezesné noci se mi podařilo dostat se až na dno tohoto problému. Doufejme, že to pomůže někdo a někdo bude moci vrhnout světlo do mě o zamezení takové věci. Takže tady jde.

Běžel jsem následující znovu s volbou -D tentokrát a ukázalo se úplně jiný výkon a ten, který jsem tak trochu očekával. To mělo za následek nic a „ECONZ :: Corba :: ComboElementSeq_T :: ComboElementSeq_T“ nebyla nalezena.

nm -DC ../installed_components/lib/libCorbaIdl.so | grep "ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T"

Pak mě to nějak vedly k domněnce, problém kompilace s lib. Tak jsem se pozorně podíval do kompilátoru vlajek a bylo zjištěno, tyto dvě „-fvisibility = skryté -fvisibility-inlines skryté“. To přichází z ACE / TAO a to byl nový atribut, které jste přidali, protože GCC 4. To bylo příčinou dynamické symboly, které mají být skryty. Takže moje otázka pro každého, kdo si je vědom toho, co jsem měl udělat propojit knihovnu?

Pro další četbu naleznete http://gcc.gnu.org/wiki/Visibility

Odpovězeno 25/08/2010 v 07:39
zdroj uživatelem

hlasů
1

Vzhledem k tomu říkáte

nm --demangle ../installed_components/lib/libCorbaIdl.so
> 0002d768 t ECONZ::Corba::ComboElementSeq_T::ComboElementSeq_T()

To znamená, že ComboElementSeq_T () je v lib -lCorbaIdl
Pokud není nalezen referenční, potom se používá jednoho z uvedených knihoven po této knihovny:

> -lCorbaIdl -lTAO_Valuetype -lTAO_PortableServer -lTAO_IORTable
> -lTAO_AnyTypeCode -lTAO_CosEvent -lTAO_CosNaming -lTAO -lACE

Tak jeden z follwoing obsahuje: TestSeqWrapper.o: In functionSeqWrapper'`

  • -lTAO_Valuetype
  • -lTAO_PortableServer
  • -lTAO_IORTable
  • -lTAO_AnyTypeCode
  • -lTAO_CosEvent
  • -lTAO_CosNaming
  • -lTAO
  • -krajka

Viz: chyby GCC C ++ linker: nedefinováno odkaz na 'VTable pro XXX', nedefinovaný odkaz na 'newClassName :: newClassName ()'

Máte-li stavět všechny libs jako sdílené knihovny pak tento problém zmizí.

Odpovězeno 24/08/2010 v 12:55
zdroj uživatelem

hlasů
0

Nevím, jestli to má smysl pro každého, ale zdá se, že používání knihovny jako statické namísto sdílených funguje perfektně. Takže jsem připojený

/u01/kasunt/workspace/corelibCORBA/installed_components/lib/libCorbaIdl.a

a fungovalo to perfektně. Někdo schopen vysvětlit to ?????

Odpovězeno 25/08/2010 v 01:16
zdroj uživatelem

hlasů
0

typo v odkazu linii?

-L/u01/kasunt/workspace/corelibCORBA/idl

mělo by

-L/u01/kasunt/workspace/corelibCORBA/lib
Odpovězeno 24/08/2010 v 13:01
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more