视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
error:undefinedreferenceto'xxx)'collect
2020-11-09 08:32:12 责编:小采
文档

作者:金良(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.h"

void 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遇到的问题、解决方法、相关文件和编译全过程

下载本文
显示全文
专题