簡體   English   中英

鏈接時的C ++未定義參考

[英]C++ undefined reference when linking

我想知道是否有人能夠幫助我,因為我已經為此撓了兩天。

我已經完成了編譯,當嘗試在linux上鏈接源代碼時得到未定義的參考

編譯使用,

g ++ -g -I / u01 / kasunt /工作區/ corelibCORBA / include -I / u01 / kasunt /工作區/ corelibCORBA / installed_components / include -I / u01 / kasunt / workspace / corelibCORBA / idl -I / u01 / kasunt / workspace / 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 /工作區/ corelibCORBA / installed_components / include -W-牆-Wpointer-arith-管道-D_POSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS -g -O -I / u01 / kasunt / workspace / corelibCORBA / include -g -O -I / u01 / kasunt / workspace / corelibCORBA / include -fvisibility = hidden -fvisibility-inlines-hidden -DACE_GCC_HAS_TEMPLATE_INSTANTIATION_VISIBILITY_ATTRS = 1 -W -Wall -Wpointer-arith -ggdb -pipe -Wall -g -D__linux__ -D__DDT_PT_RE_CE_RE = 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

鏈接使用,

g ++ -o TestSeqWrapper TestSeqWrapper.o -g -L / u01 / kasunt /工作區/ corelibCORBA / lib -L ​​/ u01 / kasunt /工作區/ 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 / workspace / corelibCORBA / installed_components / idl -lcorelibCORBA -lcorelibCORBA /u01/kasunt/workspace/corelibCORBA/installed_components/lib/corelibCORBA3r.lib / u01 / kasunt / workspace_coreedCORBA /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 / workspace / 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。 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()'

在庫的nm處,我可以看到上面的構造函數已經包含在內,

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()

源代碼上有問題的行(第165行), SeqWrapper():var_(new SequenceType),size_(0){}

部分代碼,

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() ) { }

.....

TestSeqWrapper.cpp的源代碼(我刪除了大部分不需要的東西,以減少混亂)

#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;
}

您會看到我在鏈接選項中指定了共享庫(以粗體顯示)。 最初我以為這可能是某種某種依賴關系造成的,所以將庫標志移到開頭就沒有影響。

我很感激。

既然你說

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

這意味着ComboElementSeq_T()在lib -lCorbaIdl中
如果找不到該引用,則該庫之后指定的其中一個庫正在使用該引用:

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

因此,其中一個包含: TestSeqWrapper.o: In function SeqWrapper中`

  • -lTAO_Valuetype
  • -lTAO_PortableServer
  • -lTAO_IORTable
  • -lTAO_AnyTypeCode
  • -lTAO_CosEvent
  • -lTAO_CosNaming
  • -lTAO
  • -花邊

請參閱: GCC C ++鏈接器錯誤:對“ vtable for XXX”的未定義引用,對“ ClassName :: ClassName()”的未定義引用

如果將所有庫構建為共享庫,則此問題將消失。

人,

經過10杯咖啡和幾個幾乎不眠之夜,我終於找到了問題的根源。 希望這可以幫助某人,並且某人能夠向我闡明避免此類事情的方法。 所以去了。

這次我再次使用-D選項運行以下命令,它顯示了完全不同的輸出,這是我所期望的。 結果什么也沒有,並且找不到“ ECONZ :: Corba :: ComboElementSeq_T :: ComboElementSeq_T”。

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

然后,這使我相信lib的編譯問題。 因此,我仔細查看了編譯器標志,發現了這兩個“ -fvisibility = hidden -fvisibility-inlines-hidden”。 這是從ACE / TAO來的,這是自GCC 4起他們添加的新屬性。這導致動態符號被隱藏。 因此,對於任何意識到這一點的人,我的問題是我應該怎么做才能鏈接庫?

要進一步閱讀,請閱讀http://gcc.gnu.org/wiki/Visibility

您的鏈接行中有錯字?

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

應該

-L/u01/kasunt/workspace/corelibCORBA/lib

我不知道這對任何人都有意義,但是似乎將庫作為靜態而不是共享使用是完美的。 所以我依附

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

而且效果很好。 任何人都可以解釋這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM