【问题标题】:C++ undefined reference when linking链接时的 C++ 未定义引用
【发布时间】:2011-04-03 00:29:07
【问题描述】:

我想知道是否有人可以帮助我,因为这两天我一直在摸不着头脑。

我已经完成了编译,当我尝试在 linux 上链接源代码时得到 未定义的参考

编译使用,

g++ -g -I/u01/kasunt/workspace/corelibCORBA/include -I/u01/kasunt/workspace/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/workspace/corelibCORBA/installed_components/include -W -Wall -Wpointer-arith -pipe -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=隐藏 -fvisibility-inlines-hidden -DACE_GCC_HAS_TEMPLATE_INSTANTIATION_VISIBILITY_ATTRS=1 -W -Wall -Wpointer-arith -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

链接使用,

g++ -o TestSeqWrapper TestSeqWrapper.o -g -L/u01/kasunt/workspace/corelibCORBA/lib -L/u01/kasunt/workspace/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/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/installed_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.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;
}

你可以看到我已经在链接选项中指定了共享库(以粗体显示)。我最初认为这可能是由于某种依赖关系并将库标志移到开头没有影响。

我很感激。

【问题讨论】:

  • 你能在 SeqWrapper.hpp:165 中提供该行的详细信息吗?
  • 您的路径设置不正确。检查您的 Makefile 中的 LIBPATH 和 INCLUDEPATH。检查库安装路径是否正确并指向所需目录。
  • 我刚刚粘贴了行号和部分代码
  • 我已将 lib 路径包含在以下内容中,并且 CorbaIdl 库位于“/u01/kasunt/workspace/corelibCORBA/installed_components/lib”-L/u01/kasunt/workspace/corelibCORBA/lib -L /u01/kasunt/workspace/corelibCORBA/installed_components/lib
  • 尝试在列表末尾移动 -lCorbaIdl。也删除 -g 标志,我认为你不需要这个来链接。

标签: c++ gcc build-process gnu ld


【解决方案1】:

既然你说

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 functionSeqWrapper'`

  • -lTAO_Valuetype
  • -lTAO_PortableServer
  • -lTAO_IORTable
  • -lTAO_AnyTypeCode
  • -lTAO_CosEvent
  • -lTAO_CosNaming
  • -lTAO
  • -蕾丝

见:GCC C++ Linker errors: Undefined reference to 'vtable for XXX', Undefined reference to 'ClassName::ClassName()'

如果您将所有库构建为共享库,那么这个问题就会消失。

【讨论】:

  • 为了确定,我检查了所有这些库。而且它们都不包含“ComboElementSeq_T”....除了libCorbaIdl.so。
  • 即使是这样的简单链接行也会失败并出现相同的错误 g++ -L/u01/kasunt/workspace/corelibCORBA/installed_components/lib -lCorbaIdl -o TestSeqWrapper TestSeqWrapper.o
  • @kuzyt:你误会了。我是说其他图书馆之一正在尝试使用该符号。它仅在 -lCorbaIdl 中定义的事实是我所期望的。 PS您的第二条评论包含一条不同的错误消息,表明您缺少一个库。
  • 第二个链接我确实吐出了确切的错误消息。它指向一个丢失的库可能是真的,但是这与以前的错误消息相同的事实告诉我这不依赖于其他库不是吗?我链接的其他库是 ACE/TAO 的现成库。 ECONZ::Corba 中的“ComboElementSeq_T”是自定义编写的。
  • @kuzyt:-llibrary 应该在目标文件之后。参见man ld中的OPTIONS一般描述
【解决方案2】:

人,

在喝了 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

【讨论】:

    【解决方案3】:

    你的链接行有错别字?

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

    应该是

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

    【讨论】:

    • libCorbaIdl 在 /u01/kasunt/workspace/corelibCORBA/installed_components/lib 中
    • 所以链接器路径不是错字?您可能想编辑您的问题并澄清一下。
    • "-L/u01/kasunt/workspace/corelibCORBA/lib -L/u01/kasunt/workspace/corelibCORBA/installed_components/lib" 应该是它搜索的路径。 “-L/u01/kasunt/workspace/corelibCORBA/idl”并不是一个错字,而是一个空目录。为了清楚起见,我将其删除。谢谢
    【解决方案4】:

    我不知道这对任何人是否有意义,但似乎使用库作为静态库而不是共享库可以完美地工作。所以我附上了

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

    而且效果很好。谁能解释一下??????

    【讨论】:

    • 这可能是共享库上的一个问题,尽管我在任何地方都没有任何外部代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2020-12-14
    相关资源
    最近更新 更多