作者:金良(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
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)
{
//函数体没有引用其他函数,具体内容略
}
jni/Android.mk:11: *** commands commence before first target. Stop.
这是因为Android.mk中LOCAL_SRC_FILES 加载文件时斜杠后有空格,删除即可。在另一处也可能出现类似错误,请参看Android编译ffmpeg遇到的问题、解决方法、相关文件和编译全过程
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号