我无法让 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 链接到探查器库中的任何想法?
Thanks.
g++ main.o -o main -lm -lprofiler
正如 another.anon.coward 评论的那样,你很可能成为你的受害者g++
using --as-needed
链接器标志。试试这个:
g++ main.o -Wl,--no-as-needed -lprofiler -Wl,--as-needed
Notes:
-
g++
已经添加了-lm
,无需再次添加
- 转身很重要
--as-needed
回来。不这样做可能会导致您链接到您并不真正需要的其他库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)