未定义的符号,尽管它们是在我们的.cpp文件中定义的

时间:2012-03-03 18:35:14

标签: c++ g++ ld

我正在努力建立一个用Linux构建的库。这在Windows中构建和工作,但在Linux上,当我使用静态库时,我在库中得到一个未解析的符号。代码如下所示:

class MyClass : public AnotherClassRefCounded
{
public:
  static bool queryInstance(MyClass **ppmyClass);
};

在这个类的.cpp文件中,我有:

#include "stdafx.h"
#include "MyClass.h"

MyClass* MyClass::m_pInstance = NULL;

bool MyClass::queryInstance(MyClass **myClass)
{
  if(m_pInstance == NULL)
  {
    m_pInstance = new MyClass();
    m_pInstance->incRef(); 
  }

  m_pInstance->incRef();
  *myClass = m_pInstance;
  return true;
}

现在,当在libMyLib.a上运行nm -Cu时,我得到以下输出:

[matt6809@hogganz400 libDebug]$ nm -Cu libMappingd.a | grep queryInstance
                 U AFewMoreScopes::MyClass::queryInstance(AFewMoreScopes::MyClass**)

我的系统信息是:

[matt6809@hogganz400 libDebug]$ cat /etc/redhat-release ; gcc --version
Red Hat Enterprise Linux Server release 6.1 (Santiago)
gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

出于版权原因,我无法发布相同的代码。我尽我所能复制了代码。如果您觉得我遗漏了任何信息,请随时提出要求。


更新

构建示例:

...

g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W <DEFINE FLAGS> <INCLUDE FLAGS> -o MyClass.o MyClass.cpp

...

ar cqs libMappingd.a <all object files>

更新0

这非常有趣。在“MyClass”的目标文件中,符号未被取消:

MyClass.o:
                 <My Symbol Not Undefined>

但是,如果你转到另一个目标文件:

<Other Object>.o:
                 ...
                 U Scope::MyClass::queryInstance(Socpe::MyClass**)

UPDATE1

g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o MyClass.o MyClass.cpp
g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o OtherClass.o OtherClass.cpp
rm -f libMappingd.a
ar cqs libMappingd.a <Other Objects> MyClass.o OtherClass.o

g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o OtherClass.o OtherClass.cpp
g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o MyClass.o MyClass.cpp
rm -f libMappingd.a
ar cqs libMappingd.a <Other Objects> OtherClass.o MyClass.o

没有区别我仍然在另一个库中得到未定义的符号。

2 个答案:

答案 0 :(得分:1)

我知道VC ++和GCC之间的主要区别在于您为链接器提供的目标文件的顺序很重要。在目标文件A中使用的符号必须在其中或在链接顺序中定义。

尝试将MyClass.o移动到目标文件列表的末尾。

答案 1 :(得分:0)

经过大量研究后,我发现RHEL 6.1上的归档程序存在错误。我停止尝试将静态库直接插入共享动态库,而是解压缩静态库,并将相应的目标文件直接拖入.so文件中。我现在在我们的库中有0个未定义的符号,除了那些我没有静态链接的符号。