我无法在Ubuntu 11.10中获取gcc以正确链接到google perftools -lprofiler。 问题似乎是链接器丢弃了不直接在程序中使用的库。
一个例子会有所帮助。
我们称之为main.cpp:
#include <math.h>
int main()
{
double value;
for (int i=0; i < 1000000; i++)
{
for (int j=0; j < 1000; j++)
value = sqrt(100.9);
}
return 0;
}
使用编译:
g++ -c main.cpp -o main.o
g++ main.o -o main -lm -lprofiler
使用ldd ./main:
检查可执行文件 linux-vdso.so.1 => (0x00007fff5a9ff000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f32bc1c9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f32bc593000)
通常情况下,我会跑:
CPUPROFILE=/tmp/profile ./main
生成配置文件输出。但由于未链接配置文件库,因此不生成配置文件输出。
我已确保探查器库位于我的搜索路径中,并尝试直接链接到共享库和静态库。
上述测试在Ubuntu 10.04,Ubuntu 10.10,Ubuntu 11.04,SUSE 12.1和Fedora 16上运行良好。
此外,一旦我包含使用分析器的函数调用(例如ProfilerStart()和ProfilerStop()),则分析器库将链接到可执行文件中。
关于如何在探查器库中链接gcc的任何想法?
感谢。
答案 0 :(得分:4)
g++ main.o -o main -lm -lprofiler
正如another.anon.coward评论的那样,您很可能成为g++
使用--as-needed
链接器标志的受害者。试试这个:
g++ main.o -Wl,--no-as-needed -lprofiler -Wl,--as-needed
注意:
g++
已添加-lm
,无需再次添加--as-needed
非常重要。不这样做可能会导致您链接到您真正不需要的其他库。答案 1 :(得分:3)
就我而言,问题是libprofiler.so.0
中只有libprofiler.so
和/usr/lib/
:
user@compy:/usr/include$ dpkg -L libgoogle-perftools4
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libgoogle-perftools4
/usr/share/doc/libgoogle-perftools4/README.Debian
/usr/share/doc/libgoogle-perftools4/copyright
/usr/lib
/usr/lib/libprofiler.so.0.4.5
/usr/lib/libtcmalloc.so.4.2.6
/usr/lib/libtcmalloc_debug.so.4.2.6
/usr/lib/libtcmalloc_and_profiler.so.4.2.6
/usr/share/doc/libgoogle-perftools4/AUTHORS
/usr/share/doc/libgoogle-perftools4/TODO
/usr/share/doc/libgoogle-perftools4/README.gz
/usr/share/doc/libgoogle-perftools4/NEWS.gz
/usr/share/doc/libgoogle-perftools4/changelog.Debian.gz
/usr/lib/libtcmalloc.so.4
/usr/lib/libtcmalloc_and_profiler.so.4
/usr/lib/libprofiler.so.0
/usr/lib/libtcmalloc_debug.so.4
我不知道对此有何正式解决方法,但我只是在/ usr / lib中创建了一个符号链接:
user@compy:/usr/lib$ sudo ln -s libprofiler.so.0 libprofiler.so
这将使-lprofiler
有效。
如果您不介意更改Makefile,也可以指定-l:libprofiler.so.0
而不是-lprofiler
(请注意额外的冒号)(source)。
编辑:获取.so
的官方方式显然是安装libgoogle-perftools-dev
包,如here所述:
user@compy:/usr/lib$ dpkg -S libprofiler.so
libgoogle-perftools-dev: /usr/lib/libprofiler.so
libgoogle-perftools4: /usr/lib/libprofiler.so.0.4.5
libgoogle-perftools4: /usr/lib/libprofiler.so.0
我了解如果您要链接到某个lib,则应安装libx-dev
包,其中包含/usr/lib/libx.so
。此文件只是特定版本的符号链接,例如/usr/lib/libx.so.1.2
。当您通过为链接器指定/usr/lib/libx.so
链接-lx
时,您实际上会通过录制libx.so.1
的SONAME(最后一个)来针对当时链接的特定版本在您的程序中创建一个链接版本号被剥离为oul here)。因此,当您稍后运行程序时,动态链接器将仅查找符号链接到/usr/lib/libx.so.1
的{{1}},而不查找/usr/lib/libx.so.1.2
因此没有/usr/lib/libx.so
包需要存在。
因此dev
包用于编译和链接libx-dev
,而libx
包用于针对libx
运行预编译程序。