Неопределенные символы, хотя они определены в нашем файле .cpp - PullRequest
1 голос
/ 03 марта 2012

Я работаю над созданием библиотеки для сборки в 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;
}

Теперь при запуске nm -Cu в libMyLib.a я получаю следующий вывод:

[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 ]

1 голос
/ 03 марта 2012

Основное различие, которое я знаю между VC ++ и GCC, заключается в том, что порядок объектных файлов, которые вы передаете компоновщику, имеет значение. Символ, который используется в объектном файле A, должен быть определен либо в нем, либо после него в порядке ссылок.

Попробуйте переместить MyClass.o в конец списка объектных файлов.

0 голосов
/ 12 марта 2012

После долгих исследований я обнаружил, что в архиваторе RHEL 6.1 есть ошибка. Я прекратил пытаться вставить статические библиотеки прямо в общую динамическую библиотеку, и вместо этого я распаковал статические библиотеки и перетащил соответствующие объектные файлы прямо в файл .so. У меня теперь 0 неопределенных символов в нашей библиотеке, кроме тех, с которыми я не статически связываюсь.

...