4

私はこれで2日間頭をかいていたので、誰かが私を助けてくれるだろうかと思っています。

私はコンパイルを行い、Linuxでソースコードをリンクしようとすると未定義の参照が取得されます

を使用してコンパイルします。

g ++ -g -I / u01 / kasunt / worksheet / corelibCORBA / include -I / u01 / kasunt / worksheet / corelibCORBA / installed_components / include -I / u01 / kasunt / worksheet / corelibCORBA / idl -I / u01 / kasunt / worksheet / corelibCORBA / src / Server -I / u01 / kasunt /ワークスペース/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 / worksheet / corelibCORBA / installed_components / include -W -Wall -Wpointer-arith -pipe -D_POSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS -g -O -I / u01 / kasunt / worksheet / corelibCORBA / include -g -O -I / u01 / kasunt / worksheet / 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_ = 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.cppcppcpp

を使用してリンクする

g ++ -o TestSeqWrapper TestSeqWrapper.o -g -L / u01 / kasunt / worksheet / corelibCORBA / lib -L ​​/ u01 / kasunt / worksheet / 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 /ワークスペース/corelibCORBA/installed_components/idl-lcorelibCORBA-lcorelibCORBA/u01/kasunt/workspace/corelibCORBA/installed_components/lib/corelibCORBA3r.lib/u01/kasunt/workspace /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 /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/installed_components/lib/Appl 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 /ワークスペース/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 /ワークスペース/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 /ワークスペース/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()'

ライブラリの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;
}

また、リンクオプション(太字で表示)で共有ライブラリを指定したことがわかります。私は当初、何らかの依存関係が原因である可能性があると考え、ライブラリフラグを最初に移動しても影響はありませんでした。

それは有り難いです。

4

4 に答える 4

1

人々、

10杯のコーヒーとほとんど眠れない夜を過ごした後、私はなんとか問題の根底にたどり着きました。うまくいけば、これは誰かと誰かがそのようなことを避けることについて私にいくつかの光を当てることができるようになるでしょう。だからここに行きます。

今回は-Dオプションを使用して次のコマンドをもう一度実行しましたが、まったく異なる出力が表示され、期待どおりの出力が表示されました。結果は何も発生せず、「ECONZ :: Corba :: ComboElementSeq_T::ComboElementSeq_T」が見つかりませんでした。

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

それから、libのコンパイルの問題を信じるようになりました。そこで、コンパイラフラグを詳しく調べたところ、これら2つの「-fvisibility =hidden-fvisibility-inlines-hidden」が見つかりました。これはACE/TAOからのものであり、GCC 4以降に追加された新しい属性でした。これにより、動的シンボルが非表示になりました。それで、これを知っている人への私の質問は、ライブラリをリンクするために私が何をすべきだったかということです。

詳細については、 http://gcc.gnu.org/wiki/Visibilityをお読みください。

于 2010-08-25T06:39:51.363 に答える
1

あなたが言うので

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

これは、ComboElementSeq_T()がlib -lCorbaIdlにあることを意味し
ます。参照が見つからない場合は、このライブラリの後に指定されているライブラリの1つによって使用されています。

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

したがって、次の1つには次のものが含まれます:TestSeqWrapper.o: In functionSeqWrapper'`

  • -lTAO_Valuetype
  • -lTAO_PortableServer
  • -lTAO_IORTable
  • -lTAO_AnyTypeCode
  • -lTAO_CosEvent
  • -lTAO_CosNaming
  • -lTAO
  • -レース

参照:GCC C ++リンカーエラー:「vtablefor XXX」への未定義の参照、「ClassName :: ClassName()」への未定義の参照

すべてのライブラリを共有ライブラリとしてビルドすると、この問題は解消されます。

于 2010-08-24T11:55:33.307 に答える
0

リンクラインのタイプミス?

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

する必要があります

-L/u01/kasunt/workspace/corelibCORBA/lib
于 2010-08-24T12:01:12.097 に答える
0

これが誰にとっても理にかなっているのかどうかはわかりませんが、共有ではなく静的としてライブラリを使用すると完全に機能するようです。だから私は添付しました

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

そしてそれは完璧に機能しました。これを説明できる人は誰ですか?????

于 2010-08-25T00:16:29.170 に答える