有个 C++的开源项目,我死活找不到一个函数在哪个地方定义的。

2015-11-30 09:39:41 +08:00
 bluesky139

https://github.com/mstorsjo/fdk-aac
这个项目很小,就几个文件,几秒就编译完了。

这个文件:./libAACenc/src/aacenc_lib.cpp
里面调用了 Get_AacEncoder()这样一个函数,但项目里面找不到实现。
但又编译通过了,那我想这个函数只能是系统函数了,但系统里找遍了也没找到。
这怎么回事?

1905 次点击
所在节点    C
15 条回复
kkhaike
2015-11-30 09:44:51 +08:00
objdump -Dslx libfdk-aac.so.1.0.0 | grep Get_AacEncoder
harry890829
2015-11-30 09:45:24 +08:00
那个 cpp 包含了什么头文件呢?都是系统的么?
kkhaike
2015-11-30 09:47:38 +08:00
搞错了,这个好像是目标
zhuangzhuang1988
2015-11-30 09:51:02 +08:00
让你不用 ide!!
harry890829
2015-11-30 09:55:26 +08:00
@zhuangzhuang1988 哈哈,用 ide 确实直接查看定义就好
bluesky139
2015-11-30 09:57:50 +08:00
@kkhaike objdump 看到的确实是个函数。
objdump -Dslx libfdk-aac.so | grep Get_AacEncoder
000000000008dea0 l O .rodata 0000000000000020 _ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__
0000000000022b70 l F .text 0000000000000033 _Z14Get_AacEncoderi
0f910 4765745f 41616345 6e636f64 65726900 Get_AacEncoderi.
0000000000022b70 <_Z14Get_AacEncoderi>:
_Z14Get_AacEncoderi():
22b72: 75 0f jne 22b83 <_Z14Get_AacEncoderi+0x13>
22b83: 48 8d 0d 16 b3 06 00 lea 0x6b316(%rip),%rcx # 8dea0 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__>
22d9a: e8 d1 fd ff ff callq 22b70 <_Z14Get_AacEncoderi>
8de30: 73 74 jae 8dea6 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x6>
8de3a: 42 75 66 rex.X jne 8dea3 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x3>
8de3f: 73 63 jae 8dea4 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x4>
8de47: 73 74 jae 8debd <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x1d>
8de51: 42 75 66 rex.X jne 8deba <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x1a>
8de56: 73 63 jae 8debb <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x1b>
8de7e: 73 2a jae 8deaa <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0xa>
000000000008dea0 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__>:
_Z14Get_AacEncoderi():
22b3a: 7c 66 jl 22ba2 <_Z14Get_AacEncoderi+0x32>
22b43: 76 3a jbe 22b7f <_Z14Get_AacEncoderi+0xf>
22b58: 7d 4a jge 22ba4 <_Z14Get_AacEncoderi+0x34>
_Z14Get_AacEncoderi():
22b7c: 79 01 jns 22b7f <_Z14Get_AacEncoderi+0xf>
22af6: 70 79 jo 22b71 <_Z14Get_AacEncoderi+0x1>
22b19: 73 65 jae 22b80 <_Z14Get_AacEncoderi+0x10>
22b27: 42 79 74 rex.X jns 22b9e <_Z14Get_AacEncoderi+0x2e>
22b2e: 79 74 jns 22ba4 <_Z14Get_AacEncoderi+0x34>
22b34: 73 65 jae 22b9b <_Z14Get_AacEncoderi+0x2b>
22b38: 70 42 jo 22b7c <_Z14Get_AacEncoderi+0xc>
_Z14Get_AacEncoderi():
22ba2: 73 00 jae 22ba4 <_Z14Get_AacEncoderi+0x34>
22bab: 72 00 jb 22bad <_Z14Get_AacEncoderi+0x3d>
_Z14Get_AacEncoderi():
8de9e: 78 05 js 8dea5 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x5>
8dea9: 78 05 js 8deb0 <_ZZ14Get_AacEncoderiE19__PRETTY_FUNCTION__+0x10>
_Z14Get_AacEncoderi():
mrhhsg
2015-11-30 09:59:02 +08:00
kkhaike
2015-11-30 09:59:44 +08:00
那是编译进去了,是不是编译前自动生成的代码
mrhhsg
2015-11-30 10:00:18 +08:00
@mrhhsg
一般来讲如果全文搜索不到的符号,很可能是预定义宏
kkhaike
2015-11-30 10:00:41 +08:00
楼上正解
bluesky139
2015-11-30 10:00:44 +08:00
@harry890829
@zhuangzhuang1988
不仅包含系统,也包含了一些项目中的文件。
https://github.com/mstorsjo/fdk-aac/blob/master/libAACenc/src/aacenc_lib.cpp

不想搞 IDE ,这么小个项目,而且直接 configure 再 make 一下就完了,搞 IDE 麻烦啊。
bluesky139
2015-11-30 10:03:56 +08:00
@mrhhsg 多谢,居然没找到,因为 objdump 出来是确有这个函数我就没想函数名跟宏的名字是一样的,唉。
zhuangzhuang1988
2015-11-30 11:16:04 +08:00
@bluesky139 你这样做也麻烦..
coofly
2015-11-30 13:57:45 +08:00
curl 里边也有一堆函数是像这样用宏定义的
fxxkgw
2015-11-30 15:34:52 +08:00
你可以用 gdb+demo 方式运行 然后 r 之前用 b 加这个函数断点,如果找不到那肯定是宏定义了,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/239914

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX