作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591 编译动态链接库时,出现了这样的错误: error: undefined reference to 'xxx)' collect2: ld returned 1 exit status 属性1. 我能肯定这与要调用动态库的java文件没有任何
作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591
编译动态链接库时,出现了这样的错误:
error: undefined reference to 'xxx)' collect2: ld returned 1 exit status
属性1.
我能肯定这与要调用动态库的java文件没有任何关系,因为我把java文件删除然后重新编译也是这样的错误。
属性2.
我也能肯定这绝不是因为我没有把要用到的头文件包括进来,而且我试着将另一个函数的头文件注释掉,提示的错误是:
error: 'xxxxx' was not declared in this scope
属性3.
当我把函数名称更改使其前后名称不一致时也提示错误:
error: 'xxxxx' was not declared in this scope
属性4.
甚至我把直接把这个函数写进要调用它的文件里,仍然是这样的错误。
属性5.
已确定不是android.mk文件的问题
什么情况下会产生“error: undefined reference to 'xxx)' collect2: ld returned 1 exit status“的错误呢?不明白这个函数为什么这么特殊,唯独它出现这样的错误。
明明定义了这个函数,却出现了“error: undefined reference to”的错误?怪哉
方案1.
在网上查到这样一种解决方案,它是这样描述的:
在android.mk中加入 local_allow_undefined_symbols := true
也就是说,对于找不到的函数,编译器将忽略它。
我勒个去,我写这个函数就是要它干活的,你忽略它,虽然编译时过关了,但是我调用这个函数时不还是找不到吗?我还不如直接把这个函数删掉。
方案2.
经过我仔细核对,层层排除,终于发现了问题所在。再次还原一下错误提示
in function render:/bitmapplayeractivity.cpp:35: error: undefined reference to 'brightnessfilter(unsigned short*, long, unsigned char)'
collect2: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/libaviplayer.so] error 1
同时贴出出现错误的函数所在的文件bitmapplayeractivity.cpp:
#ifdef __arm_neon__ void brightnessfilter( unsigned short* pixels, long count, unsigned char brightness) { //具体内容忽略 } static void neonbrightnessfilter( unsigned short* pixels, long count, unsigned char brightness) { //具体内容忽略 }#endif
你看出问题所在了吗?注意第01行和17行的宏#ifdef __arm_neon__与#endif,它们配合起来根据变量__arm_neon__之前是否被定义而选择编译它们之间的代码;不行的是,本工程中__arm_neon__未被定义,故函数brightnessfilter(unsigned short*, long, unsigned char)未被编译,所以才出现了error: undefined reference的错误。ps1.
需要注意的是,在同一个cpp文件里如果函数之间存在调用关系,一定要把被调用的函数写在要调用它的函数的前面,例如下面的文件编译时会提示如下错误:
jni/brightnessfilter.cpp: in function 'void brightnessfilter(short unsigned int*, long int, unsigned char)':
jni/brightnessfilter.cpp:7:52: error: 'genericbrightnessfilter'was not declared in this scope
make.exe: *** [obj/local/armeabi/objs/aviplayer/brightnessfilter.o] error 1
brightnessfilter.cpp:
#include brightnessfilter.hvoid brightnessfilter(unsigned short* pixels, long count, unsigned char brightness){ genericbrightnessfilter(pixels, count, brightness);//调用了genericbrightnessfilter(),但函数genericbrightnessfilter()在brightnessfilter()函数之前并没有实现体,所以出错}static void genericbrightnessfilter( unsigned short* pixels, long count, unsigned char brightness){ //函数体没有引用其他函数,具体内容略}
ps2.
jni/android.mk:11: *** commands commence before first target. stop.
这是因为android.mk中local_src_files 加载文件时斜杠后有空格,删除即可。在另一处也可能出现类似错误,请参看android编译ffmpeg遇到的问题、解决方法、相关文件和编译全过程