Android 即使MakeFile包含其对象文件,也不会添加C文件中的符号

Android 即使MakeFile包含其对象文件,也不会添加C文件中的符号,android,c,makefile,ffmpeg,android-ndk,Android,C,Makefile,Ffmpeg,Android Ndk,我正试图用这个来构建libavformat。尽管makefile在其构建指令中包含了avio.o文件,但它没有为头文件url.h中声明的函数添加任何符号。可以找到包含avio.c、avio.h和url.h文件的源文件夹 avio.o的nm命令返回 nm:avio.o:无法识别文件格式 avio.o上的file命令显示以下输出 avio.o: LLVM IR bitcode 我已经检查了生成的libavformat.so上的nm命令,没有找到url.h文件中声明的函数的任何符号 这件事我已经坚持

我正试图用这个来构建libavformat。尽管makefile在其构建指令中包含了
avio.o
文件,但它没有为头文件
url.h
中声明的函数添加任何符号。可以找到包含
avio.c、avio.h和url.h
文件的源文件夹

avio.o
的nm命令返回

nm:avio.o:无法识别文件格式

avio.o
上的
file
命令显示以下输出

avio.o: LLVM IR bitcode
我已经检查了生成的libavformat.so上的nm命令,没有找到
url.h
文件中声明的函数的任何符号

这件事我已经坚持了两天了。想不出如何解决这个问题

调用
ff\u check\u interrupt
方法并导致

对“ff\U检查\U中断”的未定义引用

配置和标志

  • FFmpeg配置文件:
  • FFmpeg根生成文件:
  • CC、CXX、CFLAGS、LDFLAGS:

首先,由
url.h
声明的函数应该在
url.c
中定义,而不是在
avio.c
中定义

其次,
avoi.c
中的
ff\u check\u interrupt
的唯一用法是在静态内联函数中使用,因此实际上,工具链很可能正在优化这个符号

我认为现在发生的是,工具链决定只在这个编译单元中使用它

ff\u check\u interrupt
的定义移动到“url.c”应该可以解决这个问题。这是一个图书馆,所以你无法控制


然而,这并不能回答为什么他们的代码中有相同的库。我建议将您的Makefile与这些文件进行比较(例如,第一次搜索返回是。

您是否使用
nm
进行了检查?是的,我使用了以下nm命令
nm-gD libavformat.so
。但是结果不包含
ff\u check\u interrupt
很抱歉,启动bounty时我给出了错误的信息。FFMPEG实际上成功构建了。这意味着所有
so
文件都是成功构建。但是当我们试图通过
jni
调用
libavformat中的一些函数时,那么在
libavformat上找不到该函数。因此
尽管makefile在构建
so
时包含了它。
jni
实际上首先调用了c源文件中的某个函数和该c源文件文件调用libavformat.so缺少的函数。这里我们被卡住了。您是否已将ff\u check\u中断函数标记为
\uu属性(可见性(“默认”))
?不,我们没有用该属性对其进行标记。我们看到另一个名为
libavformat.so.58
的共享库包含缺少的符号。在构建日志中,我们看到此
so
被剥离并转换为
libavformat.so
,它没有符号。此剥离命令导致问题吗?如何解决我们可以删除它吗?谢谢你的评论。我们将函数定义从
avio.c
移动到
url.c
。但是结果是一样的。我们将你提供的make文件与我们的makefile进行了比较,它们几乎完全相同。c文件的名称与此无关。在avio中定义url.h中声明的符号非常好C