неопределенная ссылка на публичный API tcmalloc

Я клонировал git-perf git tree.

> ./autogen.sh
> ./configure --enable-frame-pointers --prefix=/usr/
> make
> sudo make install

Все вышеперечисленные шаги были успешными. Я вижу файлы заголовков в /usr/include/gperftools/tcmalloc.h и т. Д.

Моя программа

 #include <stdio.h>
#include <gpertools/malloc_extension.h>
#include <iostream>

int main()
{
const unsigned int tcmalloc_stats_buf_len_ = 32768;
char tcmalloc_stats_buf[tcmalloc_stats_buf_len_];

MallocExtension::instance()->GetStats(tcmalloc_stats_buf,
tcmalloc_stats_buf_len_);
printf("%s ",tcmalloc_stats_buf);
fflush(stdout);
}

компиляция

g++ -ltcmalloc my_prog.c -o my_prog
my_prog.cc: undefine reference to MallocExtension::instance

Если я закомментирую строку GetStats, то компиляция работает нормально. Так что я предполагаю, что это связано с tcmalloc. Однако, когда я пытаюсь получить доступ к API, это выдает мне ошибку.

В чем может быть проблема? Любые идеи возможно?

0

Решение

От алексея кандраценка

Попробуйте переместить -ltcmalloc до конца. Особенно в режиме статического связывания,
компоновщик только глядя на объекты библиотеки в то время, когда это
обрабатывая его в порядке, указанном в командной строке, и он вытягивает только символы
известно, что нужно в это время. Это не широко известная «ошибка» в статических ссылках, которая иногда делает необходимым указывать библиотеки
дважды или более раз.

Это не должно влиять на динамическое связывание, но я думаю, что я слышал некоторые
дистрибутивы (возможно, Ubuntu) слишком креативны со своим компоновщиком
конфигурации (и требуют -Wl, — не по мере необходимости или что-то вроде
тот).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]