error: undefined reference to 'xxx)' collect2: ld returned 1 exit status终极解决

作者:金良([email protected]) csdn博客:http://blog.csdn.net/u012176591

error: undefined reference to 'xxx)' collect2: ld returned 1 exit status终极解决_第1张图片

编译动态链接库时,出现了这样的错误:

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


你可能感兴趣的:(error,undefined,编译,reference,commands,commence)