How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?
-
Hi
I would make a new .h file for it as not to be messy.
This file would list the functions from main.cHowever, if the main.cpp is included in the project, you can use without .h file like this
void/int SAMPLE_VDEC_VdhH264(); //// forward declare it
void MainWindow::on_pushButton_clicked()
{
SAMPLE_VDEC_VdhH264(); // call it
}@mrjj I've included the headers from my sample source file in main.mpp as well, with the SAMPLE_VDEC_VdhH264 function declaration.
In mainwindow.cpp
#include "mainwindow.h"
#include <QApplication>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/time.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <math.h>
#include <unistd.h>
#include <signal.h>
#include "sample_comm.h"int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();int SAMPLE_VDEC_VdhH264(); return a.exec();
}
In mainwindow.cpp, invoke the function SAMPLE_VDEC_VdhH264
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::on_pushButton_clicked()
{SAMPLE_VDEC_VdhH264();
}
I tried to build again but it says the same error though (i.e. in mainwindow.cpp, 'SAMPLE_VDEC_VdhH264 was not declared in this scope')
-
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();int SAMPLE_VDEC_VdhH264(); <<<< why here??? that is forward in main. not what i ment.
return a.exec();
}Did you make a .h file with ?
int SAMPLE_VDEC_VdhH264();else
i mean likeint SAMPLE_VDEC_VdhH264();
void MainWindow::on_pushButton_clicked()
{SAMPLE_VDEC_VdhH264();
}
-
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();int SAMPLE_VDEC_VdhH264(); <<<< why here??? that is forward in main. not what i ment.
return a.exec();
}Did you make a .h file with ?
int SAMPLE_VDEC_VdhH264();else
i mean likeint SAMPLE_VDEC_VdhH264();
void MainWindow::on_pushButton_clicked()
{SAMPLE_VDEC_VdhH264();
}
@mrjj my apologies, I've read it otherwise. However, it seems that the compiler can't find my function definition. It's a separate source code which I've added into the project entitled "sample_vdec.c". The function definition in this source code is:
HI_S32 SAMPLE_VDEC_VdhH264(HI_VOID)
{
....................
}I've amended to the following:
in mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "hi3536mainfx.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}MainWindow::~MainWindow()
{
delete ui;
}HI_U32 SAMPLE_VDEC_VdhH264();
void MainWindow::on_pushButton_clicked()
{SAMPLE_VDEC_VdhH264();
}
in main.cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();return a.exec();
}
in header
#ifndef HI3536MAINFX_H
#define HI3536MAINFX_H
#include <hi_type.h>
#include <hi_comm_vb.h>typedef struct hiVDEC_USERPIC_S
{
HI_U32 u32PicWidth;
HI_U32 u32PicHeigth;
VB_POOL u32PoolId;
VB_BLK u32BlkHandle;
HI_U32 u32PhyAddr;
HI_VOID *pVirAddr;
}VDEC_USERPIC_S;HI_U32 SAMPLE_VDEC_VdhH264();
#endif // HI3536MAINFX_H
-
since you have a
HI3536MAINFX_H
with
HI_U32 SAMPLE_VDEC_VdhH264();you dont need it over
void MainWindow::on_pushButton_clicked()
also.so compiles now?
-
since you have a
HI3536MAINFX_H
with
HI_U32 SAMPLE_VDEC_VdhH264();you dont need it over
void MainWindow::on_pushButton_clicked()
also.so compiles now?
@mrjj discovered some error in datatype in my code but rectified it but still unable to compile. The error says undefined reference to SAMPLE_VDEC_VhdH264(); and ld returned 1 exit status.
When I highlightedVDEC_SAMPLEVhdH264();
in main.cpp and hit [F2] cursor recursively, it brings me to the sample source code where this function is defined but doesn't brings me to the header where I declared this function.** in main.cpp **
#include "mainwindow.h" #include "ui_mainwindow.h" #include "hi3536mainfx.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { SAMPLE_VDEC_VdhH264(); }
** in sample source code where SAMPLE_VDEC_VhdH264() is defined: **
HI_S32 SAMPLE_VDEC_VdhH264(HI_VOID) { VB_CONF_S stVbConf, stModVbConf; HI_S32 i, s32Ret = HI_SUCCESS; VDEC_CHN_ATTR_S stVdecChnAttr[VDEC_MAX_CHN_NUM]; VdecThreadParam stVdecSend[VDEC_MAX_CHN_NUM]; VPSS_GRP_ATTR_S stVpssGrpAttr[VDEC_MAX_CHN_NUM]; ..... ..... ..... }
** in my header file **
#ifndef HI3536MAINFX_H #define HI3536MAINFX_H #include "hi_comm_vb.h" #include "hi_type.h" typedef struct hiVDEC_USERPIC_S { HI_U32 u32PicWidth; HI_U32 u32PicHeigth; VB_POOL u32PoolId; VB_BLK u32BlkHandle; HI_U32 u32PhyAddr; HI_VOID *pVirAddr; }VDEC_USERPIC_S; HI_S32 SAMPLE_VDEC_VdhH264(HI_VOID); #endif // HI3536MAINFX_H
-
@mrjj discovered some error in datatype in my code but rectified it but still unable to compile. The error says undefined reference to SAMPLE_VDEC_VhdH264(); and ld returned 1 exit status.
When I highlightedVDEC_SAMPLEVhdH264();
in main.cpp and hit [F2] cursor recursively, it brings me to the sample source code where this function is defined but doesn't brings me to the header where I declared this function.** in main.cpp **
#include "mainwindow.h" #include "ui_mainwindow.h" #include "hi3536mainfx.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { SAMPLE_VDEC_VdhH264(); }
** in sample source code where SAMPLE_VDEC_VhdH264() is defined: **
HI_S32 SAMPLE_VDEC_VdhH264(HI_VOID) { VB_CONF_S stVbConf, stModVbConf; HI_S32 i, s32Ret = HI_SUCCESS; VDEC_CHN_ATTR_S stVdecChnAttr[VDEC_MAX_CHN_NUM]; VdecThreadParam stVdecSend[VDEC_MAX_CHN_NUM]; VPSS_GRP_ATTR_S stVpssGrpAttr[VDEC_MAX_CHN_NUM]; ..... ..... ..... }
** in my header file **
#ifndef HI3536MAINFX_H #define HI3536MAINFX_H #include "hi_comm_vb.h" #include "hi_type.h" typedef struct hiVDEC_USERPIC_S { HI_U32 u32PicWidth; HI_U32 u32PicHeigth; VB_POOL u32PoolId; VB_BLK u32BlkHandle; HI_U32 u32PhyAddr; HI_VOID *pVirAddr; }VDEC_USERPIC_S; HI_S32 SAMPLE_VDEC_VdhH264(HI_VOID); #endif // HI3536MAINFX_H
@embdev said in How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?:
in sample source code where SAMPLE_VDEC_VhdH264() is defined:
Is the source file containing SAMPLE_VDEC_VhdH264() part of your project and is it built?
-
@embdev said in How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?:
in sample source code where SAMPLE_VDEC_VhdH264() is defined:
Is the source file containing SAMPLE_VDEC_VhdH264() part of your project and is it built?
-
@jsulm yes it is, the source file containing the function definition SAMPLE_VDEC_VhdH264() is added physically into the project file.
@embdev You should check the complete "Compile Output" to see whether that file was really built and linked to your executable.
Don't forget that you should always execute qmake again (and do a rebuild) if you change the .pro file! -
@embdev You should check the complete "Compile Output" to see whether that file was really built and linked to your executable.
Don't forget that you should always execute qmake again (and do a rebuild) if you change the .pro file!@jsulm I did a clean, followed by build again in Qt Creator IDE environment but still receiving the error:
In the .pro file, my source file containing the SAMPLE_VDEC_VhdH264() is also included under SOURCES +=This is an output from the compile tab:
5:39:36: Running steps for project vdec_test... 15:39:36: Configuration unchanged, skipping qmake step. 15:39:36: Starting: "/usr/bin/make" arm-hisiv400-linux-g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../../v1_QtEmbedded-4.8.6/mkspecs/qws/linux-hisiv400-arm-g++ -I../vdec_test -I../../v1_QtEmbedded-4.8.6/include/QtCore -I../../v1_QtEmbedded-4.8.6/include/QtNetwork -I../../v1_QtEmbedded-4.8.6/include/QtGui -I../../v1_QtEmbedded-4.8.6/include -I../../mpp_single/sample/common -I../../mpp_single/include -I../../mpp_single/extdrv/tlv320aic31 -I../../v1_QtEmbedded-4.8.6/examples/multimedia/videographicsitem -I../../mpp_single/lib -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I. -I. -I../vdec_test -I. -o mainwindow.o ../vdec_test/mainwindow.cpp arm-hisiv400-linux-g++ -Wl,-O1 -Wl,-rpath,/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -o vdec_test main.o mainwindow.o sample_comm_audio.o sample_comm_ivs.o sample_comm_sys.o sample_comm_vda.o sample_comm_vdec.o sample_comm_venc.o sample_comm_vi.o sample_comm_vo.o sample_comm_vpss.o sample_vdec.o moc_mainwindow.o -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -L/home/aa/Hi3536_SDK_V2.0.4.0/Working\ folder/vdec_test/../../mpp_single/lib/ -ldnvqe -lhdmi -lmpi -ljpeg -lupvqe -lVoiceEngine -lQtGui -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -lQtNetwork -lQtCore -lm -ldl -lrt -lpthread mainwindow.o: In function `MainWindow::on_pushButton_clicked()': mainwindow.cpp:(.text+0xbc): undefined reference to `SAMPLE_VDEC_VdhH264()' mainwindow.o: In function `MainWindow::on_pushButton_2_clicked()': mainwindow.cpp:(.text+0xc0): undefined reference to `SAMPLE_VDEC_VdhH265()' collect2: error: ld returned 1 exit status Makefile:125: recipe for target 'vdec_test' failed make: *** [vdec_test] Error 1 15:39:37: The process "/usr/bin/make" exited with code 2. Error while building/deploying project vdec_test (kit: HI3536 Qt4.8) When executing step "Make" 15:39:37: Elapsed time: 00:01.
-
@jsulm I did a clean, followed by build again in Qt Creator IDE environment but still receiving the error:
In the .pro file, my source file containing the SAMPLE_VDEC_VhdH264() is also included under SOURCES +=This is an output from the compile tab:
5:39:36: Running steps for project vdec_test... 15:39:36: Configuration unchanged, skipping qmake step. 15:39:36: Starting: "/usr/bin/make" arm-hisiv400-linux-g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../../v1_QtEmbedded-4.8.6/mkspecs/qws/linux-hisiv400-arm-g++ -I../vdec_test -I../../v1_QtEmbedded-4.8.6/include/QtCore -I../../v1_QtEmbedded-4.8.6/include/QtNetwork -I../../v1_QtEmbedded-4.8.6/include/QtGui -I../../v1_QtEmbedded-4.8.6/include -I../../mpp_single/sample/common -I../../mpp_single/include -I../../mpp_single/extdrv/tlv320aic31 -I../../v1_QtEmbedded-4.8.6/examples/multimedia/videographicsitem -I../../mpp_single/lib -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I../../mpp_single/include -I. -I. -I../vdec_test -I. -o mainwindow.o ../vdec_test/mainwindow.cpp arm-hisiv400-linux-g++ -Wl,-O1 -Wl,-rpath,/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -o vdec_test main.o mainwindow.o sample_comm_audio.o sample_comm_ivs.o sample_comm_sys.o sample_comm_vda.o sample_comm_vdec.o sample_comm_venc.o sample_comm_vi.o sample_comm_vo.o sample_comm_vpss.o sample_vdec.o moc_mainwindow.o -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -L/home/aa/Hi3536_SDK_V2.0.4.0/Working\ folder/vdec_test/../../mpp_single/lib/ -ldnvqe -lhdmi -lmpi -ljpeg -lupvqe -lVoiceEngine -lQtGui -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -lQtNetwork -lQtCore -lm -ldl -lrt -lpthread mainwindow.o: In function `MainWindow::on_pushButton_clicked()': mainwindow.cpp:(.text+0xbc): undefined reference to `SAMPLE_VDEC_VdhH264()' mainwindow.o: In function `MainWindow::on_pushButton_2_clicked()': mainwindow.cpp:(.text+0xc0): undefined reference to `SAMPLE_VDEC_VdhH265()' collect2: error: ld returned 1 exit status Makefile:125: recipe for target 'vdec_test' failed make: *** [vdec_test] Error 1 15:39:37: The process "/usr/bin/make" exited with code 2. Error while building/deploying project vdec_test (kit: HI3536 Qt4.8) When executing step "Make" 15:39:37: Elapsed time: 00:01.
@embdev To me it doesn't look like a complete rebuild as in the second compiler call object files, which were not compiled before, are already linked:
arm-hisiv400-linux-g++ -Wl,-O1 -Wl,-rpath,/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -o vdec_test main.o mainwindow.o sample_comm_audio.o sample_comm_ivs.o sample_comm_sys.o sample_comm_vda.o sample_comm_vdec.o sample_comm_venc.o sample_comm_vi.o sample_comm_vo.o sample_comm_vpss.o sample_vdec.o moc_mainwindow.o -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -L/home/aa/Hi3536_SDK_V2.0.4.0/Working\ folder/vdec_test/../../mpp_single/lib/ -ldnvqe -lhdmi -lmpi -ljpeg -lupvqe -lVoiceEngine -lQtGui -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -lQtNetwork -lQtCore -lm -ldl -lrt -lpthread
Please do a rebuild.
In which file is SAMPLE_VDEC_VhdH264() defined? -
@embdev To me it doesn't look like a complete rebuild as in the second compiler call object files, which were not compiled before, are already linked:
arm-hisiv400-linux-g++ -Wl,-O1 -Wl,-rpath,/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -o vdec_test main.o mainwindow.o sample_comm_audio.o sample_comm_ivs.o sample_comm_sys.o sample_comm_vda.o sample_comm_vdec.o sample_comm_venc.o sample_comm_vi.o sample_comm_vo.o sample_comm_vpss.o sample_vdec.o moc_mainwindow.o -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -L/home/aa/Hi3536_SDK_V2.0.4.0/Working\ folder/vdec_test/../../mpp_single/lib/ -ldnvqe -lhdmi -lmpi -ljpeg -lupvqe -lVoiceEngine -lQtGui -L/home/aa/Hi3536_SDK_V2.0.4.0/v1_QtEmbedded-4.8.6/lib -lQtNetwork -lQtCore -lm -ldl -lrt -lpthread
Please do a rebuild.
In which file is SAMPLE_VDEC_VhdH264() defined?@jsulm I've deleted the object files away in my build-release folder. I think could be due to datatype declaration of my function, when it's invoked as
HI_32 SAMPLE_VDEC_VdhH264();
in the main.cpp, then the project can be compiled, i.e.:** in main.cpp **
#include "mainwindow.h" #include "ui_mainwindow.h" #include "hi3536mainfx.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { HI_S32 SAMPLE_VDEC_VdhH264(); }
-
@jsulm I've deleted the object files away in my build-release folder. I think could be due to datatype declaration of my function, when it's invoked as
HI_32 SAMPLE_VDEC_VdhH264();
in the main.cpp, then the project can be compiled, i.e.:** in main.cpp **
#include "mainwindow.h" #include "ui_mainwindow.h" #include "hi3536mainfx.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { HI_S32 SAMPLE_VDEC_VdhH264(); }
-
@embdev Now you are declaring a function with same name, you are not calling it.
Functions are not called like this in C/C++.
You should really check your project configuration and sources. -
@mrjj said in How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?:
extern "c"
I think it is needed as it is a C header
-
@mrjj said in How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?:
extern "c"
I think it is needed as it is a C header
-
@jsulm
Well im not sure. Just realized I never tried a .c file with mingw and see if it will cpp compile it or
it does in fact need extern "c". :)@mrjj said in How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?:
Well im not sure.
It is absolutely needed. C++ supports overloading (which C obviously doesn't) and that ABI-wise is realized by decorating the symbols. So to be able to link properly, you need to tell the compiler that you're actually expecting C-linkage for the functions.
-
@mrjj said in How do i integrate my embedded C source codes (for my embedded linux board) with Qt GUI together?:
Well im not sure.
It is absolutely needed. C++ supports overloading (which C obviously doesn't) and that ABI-wise is realized by decorating the symbols. So to be able to link properly, you need to tell the compiler that you're actually expecting C-linkage for the functions.
@kshegunov
Thank you. The reason for my doubts is that my old compiler compiles all as cpp and
hence never needs it. And using Mingw so far, all files been cpp so was not sure if extension .c
would actually trigger different compile. And it does - so that's a key thing for c-files. -
@jsulm @mrjj wow, that's really good advice for appending extern "C" { #..... }
After adding this line, my source is able to compile successfully and boot into my embedded target Linux. Of course it's not fully up because my target source code have other issues but I guess on Qt side, it's resolved!Thank you very much folks!