ошибка поиска символа - PullRequest
       8

ошибка поиска символа

0 голосов
/ 16 сентября 2011

Я пишу разделяемую библиотеку с C ++ под Ubuntu. Исходный код содержит два файла: ClassA.h и ClassA.cpp. Ниже приведены части содержимого:

ClassA.h:

namespace calss_a{
class ClassA{
public:
   ...
   void foo(int nBlockIndex);
   ...
}
}

ClassA.h:

namespace calss_a{
    ...
   void classA::foo(int nBlockIndex){printf("....");}
    ...
}

Скомпилированный файл .so из вышеуказанных исходных кодов используется в test.cpp следующим образом:

...
class_a::ClassA * ptr = new class_a::ClassA();
...
ptr->foo(0);
...

Однако при запуске исполняемой сборки из test.cpp возникает следующая ошибка:

ошибка поиска символа: / home / hzhu / test: неопределенный символ: _ZN16class_a15ClassA16fooEj

Но если я изменю в ClassA.cpp и ClassA.h тип аргумента foo () "nBlockIndex" с "int" на "unsigned in" и перекомпилирую файл .so, проблема исчезнет. В следующем эксперименте тип аргумента «nBlockIndex» по-прежнему определяется как «int», но в test.cpp я называю «foo» следующим образом:

ptr->foo(1); //pass 1 instead of 0

тогда и проблема исчезнет.

Может кто-нибудь сказать мне, что здесь происходит?

Спасибо.

1 Ответ

0 голосов
/ 03 октября 2016

Я сам немного новичок в подобных вещах, но я также сталкиваюсь с ошибкой поиска символов и подумал, что поделюсь тем, что узнал.

Проблема с ошибками поиска символов обычно заключается в том, что что-то определяется двумя разными способами в двух разных местах. Если вы делаете

 nm -u your-executable | grep undefined-symbol

тогда вы узнаете, где определены символы, используемые в объектном файле или исполняемом файле

...