c ++ неопределенный конструктор ссылочного класса - PullRequest
3 голосов
/ 26 сентября 2011

Я пытаюсь использовать библиотеку, где у одного из классов есть конструктор, например:

public:
AreaNodeIndex(size_t cacheSize);

Я пытаюсь создать экземпляр объекта этого класса в моей программе следующим образом:

size_t const cacheSize = 50000;
AreaNodeIndex areaNodeIndex(cacheSize);

Компоновщик выдает мне следующую ошибку:

main.o: In function `main':
make: Leaving directory `/home/Dev/_quicktest_build'
main.cpp:(.text+0x212): undefined reference to  
osmscout::AreaNodeIndex::AreaNodeIndex(unsigned int)

Я думаю, что у меня есть необходимые включения, и я компилирую ссылку на библиотеку. Например, если я пытаюсь создать экземпляр объекта без каких-либо аргументов, я получаю эту ошибку:

../quicktest/main.cpp: In function ‘int main()’:
../quicktest/main.cpp:36: error: no matching function for call to ‘osmscout::AreaNodeIndex::AreaNodeIndex()’
/usr/local/include/osmscout/AreaNodeIndex.h:75: note: candidates are: osmscout::AreaNodeIndex::AreaNodeIndex(size_t)
/usr/local/include/osmscout/AreaNodeIndex.h:33: note:     osmscout::AreaNodeIndex::AreaNodeIndex(const osmscout::AreaNodeIndex&)

Итак, я вижу правильный прототип (хотя здесь написано size_t, а перед ним - unsigned int) ...

Я могу нормально пользоваться другими частями библиотеки. Вот фактические исходные файлы для рассматриваемого класса:

http://libosmscout.git.sourceforge.net/git/gitweb.cgi?p=libosmscout/libosmscout;a=blob;f=libosmscout/include/osmscout/AreaNodeIndex.h

http://libosmscout.git.sourceforge.net/git/gitweb.cgi?p=libosmscout/libosmscout;a=blob;f=libosmscout/src/osmscout/AreaNodeIndex.cpp

Я довольно растерялся относительно того, почему это происходит. Я чувствую, что пропустил что-то очевидное.

* В ответ на ответы: Библиотека получает size_t из "sys / types.h", поэтому я не думаю, что мы используем разные версии. Библиотека была скомпилирована в моей системе с тем же компилятором (g ++, linux). Изменение местоположения спецификатора 'const' не имеет никакого эффекта.

Я делаю ссылку на библиотеку. Как я уже говорил, я могу использовать другие классы из библиотеки без проблем. Вот команда связывания:

g ++ -Wl, -O1 -Wl, -rpath, / home / QtSDK / Desktop / Qt / 473 / gcc / lib -o quicktest main.o -L / home / QtSDK / Desktop / Qt / 473 / gcc / lib -losmscout -lpthread

Имя библиотеки - "osmscout".

Я

Ответы [ 5 ]

2 голосов
/ 26 сентября 2011

Возможная причина проблемы в вашем случае может быть из-за смешивания различных size_t, как упомянуто @rodrigo. Для согласованности, возможно, вы можете включить <cstddef> в том случае, если вы используете size_t, если ваш проект не объявит, что ему принадлежит typedef для size_t. Пожалуйста, обратитесь по ссылке ниже.

Пожалуйста, обратитесь Имеет ли смысл "std :: size_t" в C ++?

Надеюсь, это поможет!

1 голос
/ 26 сентября 2011

Возможно, проблема в том, что фактическая * typedef size_t зависит от нескольких опций компилятора. Даже в полной 32-битной машине это может быть unsigned int или unsigned long в зависимости от настроения разработчиков.

Итак, если библиотека скомпилирована с typedef unsigned long size_t;, а ваша программа с typedef unsigned int size_t;, у вас проблема. Вы можете проверить это с помощью objdump -t library | c++filt | grep AreaNodeIndex или чего-то подобного.

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

Вы не показываете нам самую важную часть: командную строку, используемую для редактирования.Скорее всего, вы не указываете библиотеку, с которой нужно связать (параметры -l и -L, или вы можете указать библиотеку, как и любой другой файл).

Что касается компоновщика, задающего unsigned intи компилятор size_t, это просто артефакт способа отображения ошибок: компилятор отобразит имя typedef, если именно это использовалось при объявлении функции.Компоновщик не имеет этой информации, поэтому отображает имя фактического типа.

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

Можете ли вы попробовать

const size_t cacheSize = 50000;

вместо

[править] Ну, я думаю, что если это объявление дает вам unsigned long, то есть какая-то опция компилятора, которая упускается из виду, и что size_t определяется как typedef для unsigned long в вашем компиляторе, а не как тип, который бы соответствовал с тем, что видит библиотека.

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

Похоже, вы неправильно связываетесь с библиотекой.

...