我使用的是不同版本的libm.a.我正在玩的是fdlibm的libm.a(来自Sun)。
问题是我觉得我的程序没有调用fdlibm的libm.a中的函数,而是调用系统的glibc的libm.a中的函数。
#include "fdlibm.h"
int main(){
double x = sin(3);
}
该程序是编译的C ++程序(因为它必须与其他c ++程序链接):
g ++ prog.cpp libm.a
其中libm.a是fdlibm' s。 (来自Sun,http://www.netlib.org/fdlibm/readme)
我怎么知道sin
在运行时实际调用了什么?我听说过各种各样的工具,比如objdump,gdb ......哪一种可以用于我的情况以及如何使用?
如何强制使用fdlibm的libm.a?
感谢。
答案 0 :(得分:6)
问题1.我听说过objdump,gdb等各种工具。
与gdb一样。 创建文件trace_sin.gdb
$ cat trace_sin.gdb
set confirm off
b sin
commands
bt
c
end
r
quit
运行你的程序:
$ gdb -q -x trace_sin.gdb ./a.out Reading symbols from ./a.out...(no
debugging symbols found)...done. Breakpoint 1 at 0x400498
Breakpoint 1, 0x000000314941c760 in sin () from /lib64/libm.so.6
#0 0x000000314941c760 in sin () from /lib64/libm.so.6
#1 0x0000000000400629 in main ()
正如您所见,sin
来自libm
问题2.如何强制使用fdlibm的libm.a?
请确保fdlibm中的sin
来自libm的sin
答案 1 :(得分:1)
我厌倦了链接/延迟加载.so版本的库,在某处我发现你可以通过指定库的路径来实现指向特定库的链接。
也许这可以帮助您应对挑战。
示例 - 我可以更改此命令(并链接到SDL2 .so)
$(CC) $(CC_FLAGS) $< -o $@ -L../../bag -lbag_i686 -lSDL2
并与
相同$(CC) $(CC_FLAGS) $< -o $@ -L../../bag -lbag_i686 /usr/local/lib/libSDL2.so
明确识别要使用的lib。
在ubuntu上,我可以使用'locate'来查找文件的完整路径。事实证明,SDL2(.so)同时落在/ usr / local / lib和/ usr / lib / x86_64-linux-gnu中。我想x86_64更适合我的系统,它也链接。
答案 2 :(得分:1)
我使用了以下简单的技巧来轻轻地指定&#39; (不明确)链接所需的库。这种技术可能适合您。
我已经创建了几个我必须使用的库,它们都在一个特定的路径中:&#34; / home // cvs-tools / lib1&#34;。 )
当需要使用我需要的1 boost lib时,我只需将最新的libboost_chrono.a复制到&#34; / home // cvs-tools / lib1&#34;中。没有。所以在路上。
触摸了我的make文件,这样当我更新boost时,而不是我试图记住所有含义,我只是将chrono.a的副本添加到我的make文件中,然后我的正常构建更新了lib1&#39 ;副本。
所以,通过&#39;轻轻一致,我的意思是a)我的make文件将b)特定的COTS库(boost)复制到c)我的lib1目录中,因此被同一个-L选取