Ubuntu 11.10 linking perftools library
Ubuntu 11.10 linking perftools library
我无法在 Ubuntu 11.10 中让 gcc 在 google perftools -lprofiler 中正确链接。问题似乎是链接器丢弃了未直接在程序中使用的库。
一个例子会有所帮助。
我们称之为主要.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 在分析器库中链接的任何想法?
谢谢。
g++ main.o -o main -lm -lprofiler
正如另一个.anon.coward评论的那样,你可能会成为使用链接器标志g++
的受害者--as-needed
。试试这个:
g++ main.o -Wl,--no-as-needed -lprofiler -Wl,--as-needed
笔记:
-
g++
已经添加了-lm
,无需再次添加
重新 - 打开
--as-needed
很重要。不这样做可能会导致您链接到您并不真正需要的其他库。
就我而言,问题是只有一个libprofiler.so.0
,而/usr/lib/
中没有libprofiler.so
:
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
(注意额外的冒号((源(。
编辑:获取.so
的官方方法显然是安装libgoogle-perftools-dev
包,如下所述:
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
我知道如果你想链接到某个库,你应该安装libx-dev
包,它将包含/usr/lib/libx.so
。此文件将仅是指向特定版本的符号链接,例如 /usr/lib/libx.so.1.2
。当您通过指定链接器-lx
来链接/usr/lib/libx.so
时,您实际上将通过记录 SONAME libx.so.1
(最后一个版本号在此处删除(来针对当时链接的特定版本创建一个链接。因此,当你在以后的某个时间点运行程序时,动态链接器将只查找/usr/lib/libx.so.1
,它与/usr/lib/libx.so.1.2
符号链接,并且没有/usr/lib/libx.so
因此不需要存在dev
包。
所以libx-dev
包是用来针对libx
进行编译和链接的,而libx
包是用来针对libx
运行预编译程序的
- Boost Graph Library,修复节点大小
- SFML library: http request
- 解决"ld: library not found for -ltensorflow_framework.2.3.0"
- Linking library C++
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- C++ class vs a library
- C++ library with Tensorflow on Android
- CMake:尝试在 Jenkins 构建机器上运行时出现"Linked Library"错误 (0xc0000135)
- 将 c++ cmake-library 构建发布到本地存储库时出现 Gradle 错误
- 为什么'allocate in one library and free in the other'是错误的
- 链接 library.lib 使用 setup.py.
- 目标提升::<library>已经有导入的位置 + 链接错误
- Visual Studio 2017 C++,如何定义一个"环境变量"'Additional Library Directory'?
- C++ Boost SML Library
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- Qt小部件应用程序"Library not registered"错误
- Xcode/IOS: linking a CMake library
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Ubuntu 11.10 linking perftools library