我正在Vivado HLS中用cpp编写一个图像处理应用程序。我遇到一个错误,说对ISP(函数调用(的未定义引用我已经多次看到这个错误,并在堆栈溢出中看到过类似的情况,并且之前能够调试。大多数情况下,这是以前数据类型不匹配的问题,但我似乎找不到当前版本的问题所在,我花了几个小时试图寻找它,我认为一双新的眼睛会有所帮助,以及我在这里发布它的原因。我已经发布了代码的相关部分如下:
//header file
#include "hls_stream.h"
#include <ap_fixed.h>
//#include <ap_int.h>
#include "ap_int.h"
typedef ap_ufixed<24,24> bit_24;
typedef ap_fixed<11,8> fix;
typedef unsigned char uc;
typedef ap_uint<24> stream_width;
//typedef hls::stream<uc> Stream_t;
typedef hls::stream<stream_width> Stream_t;
struct configuration
{
bool dn;
bool ct;
bool gm;
bool tm;
};
struct pixel_f
{
float r;
float g;
float b;
};
struct pixel_8
{
uc r;
uc g;
uc b;
};
void ISP(Stream_t& in,Stream_t& out, float weights_ct[3][3],float ctrl_pts[3702][3],float weights[3702][3],float coefs[4][3],int num_ctrl_pts,float rev_tone[256][3], configuration config);
//testbench file(where the function is called)
float TsTw_tran[3][3];
float ctrl_pts[3702][3];
float coefs[4][3];
float weights[3702][3];
float rev_tone_s[256][3];
Mat img_rev = imread("C:/Users/20181217/Desktop/images/imgs/output_rev.png");
bit_24 pix_in;
configuration config;
config.ct = true;
config.gm = true;
config.tm = true;
Stream_t in("in_tb");
Stream_t out("out_tb");
const int rows = 256;
const int cols = 512;
for(int i=0;i<256;i++)
{
for(int j=0; j<512;j++)
{
in << ((img_rev.at<Vec3b>(i, j)[2] << 16) | (img_rev.at<Vec3b>(i, j)[1] << 8) | (img_rev.at<Vec3b>(i, j)[0]));
}
}
ISP(in,out,TsTw_tran,ctrl_pts,weights,coefs,num_ctrl_pts,rev_tone_s,config);
//core file(wher the function is defined)
void ISP(Stream_t& in,Stream_t& out, float TsTw_tran_rec[3][3],float ctrl_pts_rec[3702][3],float weights_rec[3702][3],float coefs_rec[4][3],float num_ctrl_pts, float rev_tone[256][3],configuration version)
我得到的错误是:undefined reference to ISP(hls::stream<ap_uint<24> >&, hls::stream<ap_uint<24> >&, float (*) [3], float (*) [3], float (*) [3], float (*) [3], int, float (*) [3], configuration)' collect2.exe: error: ld returned 1 exit status
任何帮助/建议都将不胜感激,
提前感谢
在您的头中,这个ISP
函数的声明包括一个int
参数:
int num_ctrl_pts
函数的实际定义中缺少此参数,或者将其定义为float
而不是int
。
C++允许函数重载,所以就C++编译器而言,这是其他一些完全无关的函数,这个问题最终导致链接失败。
如果您想花几分钟时间检查编译器的错误消息,那么现在很明显,错误消息会准确地通知您这一事实。在你的问题中,你在函数定义的正下方显示了编译器的错误消息,这使得这个错误很容易被发现。
它在链接阶段失败了。查找具有此函数定义的库,然后将其添加到makefile(或cmake文件(中。