отменить определение ссылки на общедоступный API tcmalloc

Я клонировал git-дерево google-perf.

> ./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, это дает мне ошибку.

В чем может быть проблема? Возможно, есть идеи?


person eswaat    schedule 21.11.2015    source источник
comment
Можете ли вы предоставить нам сообщение об ошибке, которое вы получаете? Так что мы можем вам помочь.   -  person Bryan Oemar    schedule 22.11.2015


Ответы (1)


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

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

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

person eswaat    schedule 21.11.2015