Adding Qt stack to embedded linux kerenel
Dear Qt gurus, i'm pretty new to Qt;
(i) [What's this file?] may i know what's this file qt-everywhere-opensource-src-5.2.0.tar.gz used for?
(ii) [Adding Qt stack to embedded linux kernel image] I'm trying to add Qt stack to my existing embedded linux kernel image. I see that there're a lot of documentations out there, can anyone advice which would be the most ideal document for reference?
(i) The file qt-everywhere-opensource-src-5.2.0.tar.gz is a zip container which contains all sources to build up your own Qt library.
(ii) Qt basically is a library and no "stack". AFAIK you cannot "add" it to your kernel. You can cross-compile the sources and deploy the library to you root file systems for example.
Maybe its best to start your research from the very beginning.
Hi and welcome to devnet,
To add to @Qojote, what device are you targeting ? What are you using to build your system's root filesystem ?
Hi SGaist & Qojote,
i've a Network Video Recorder (NVR) SoC board that runs on ARM Cortex A17 processor, complete with the SDK and toolchain. Some pre-compiled linux kernel images; rootfs and Uboot have already been completed. I'm fairly new to Linux as well; so are there standard steps or standard tools in the SDK / Toolchain that i can CC the Qt sources and how to deploy the library to my rootfs?
What SDK is it exactly ?
@SGaist We're using HI3536 network video recorder (NVR) SDK for development.
for testing purposes, is it possible to install the qt-everywhere-opensource-src-4.8.6 on the host computer, and then run the qt demos on my embedded Linux (target board) via NFS to retrieve the bin files from my host computer?
I tried this method but I get the following error:
You really have to cross compile the Qt libraries for your target device. Therefore you need all the tools like *-g++.
Its quite useful for development when your whole rootfs is mounted via NFS.
@Qojote The cross-compiling is correct. However, the cross-compiler doesn't come with the target rootfs. It's part of the host tools usually provided with the SDK.
Correct. It was just a hint for the future.
ok, fyi, I've previously flashed in the vendor kernel image, rootfs and uboot. So right now i'll need to use the vendor's CC to make / compile all the Qt files in Qt-everywhere-opensource package?
Yes, usually, the SDK provides the cross-compiler or if not, a mean to get one. What you will also need is the "dev" version of the packages you installed on your rootfs in order to get the dependencies needed for Qt and your application (e.g. OpenSSL)
I managed to compiled executable files for my embedded Linux board using arms arch. using my SDK compiler (using the Qt-everywhere-opensource-4.8.6).
FYI, because i'm just want to run a quick test for the Qt demos, i'm actually accessing the following files below (i.e. framebuffer; deform; books) on my Putty terminal, via my NSF that is linked to the host computer running on Ubuntu.
In addition, my lib folder in my embedded development board does nt contain the Qt lib files, but those Qt lib files are instead residing in my NSF folder. Do I also need to append my .profile file in my embedded Linux to point to the NSF path for the required lib files?
Will these pose problems as described in the following 3 errors when i'm executing the demos / examples in my putty terminal (i.e. running on embedded development board)?
When I tried to execute a Qt demo in my Putty terminal, it says:
/mnt/QtEmbedded-4.8.6-arm/examples/qws/framebuffer # ./framebuffer
Error: cannot open framebuffer device: Operation not permitted
when I tried to execute deform demo on putty terminal, it says:
/mnt/QtEmbedded-4.8.6-arm/demos/deform # ./deform Bus error
when I tried to execute books demo on putty terminal, it says:
./books: error while loading shared libraries: libQtSql.so.4: cannot open shared object file: No such file or directory
You're a standard user and the
/dev/fb0access rights don't include you
I don't remember exactly but IIRC, there was a device involved e.g. error accessing the frame buffer but not related to rights.
It usually means that you don't have the Qt libraries installed on your target.
thanks for the note; which means I won't be able to run the Qt demos (that are residing on my HOST Ubuntu PC) on my target embedded board without the Qt lib?. I tried to point the path to the NFS in .profile file i.e.
but apparently this didn't help as I still can't run the demos.
For Point #1, is there a way to include access in fb0? apparently my kernel image doesn't support sudo function though, Does it mean I need to get a new kernel image with sudo function?
If you don't have sudo you may have su alone.
Well, you're building an application with Qt, so unless you make everything static, then yes, you need Qt on your target.
Where are you setting
I see. That probably explains why I can run the demos / examples on the host PC with the environment setup as my target board doesn't include Qt libraries. I'm setting my PATH in /etc/profile/ :
/etc/profile: system-wide .profile file for the Bourne shells
[ -d $1 ] && PATH="$1:$PATH"
PATH to Qt lib & bin on HOST PC
How about if I copy the entire Qt lib from HOST to TARGET, and then point the path to my TARGET/lib files, would that work if I run the Qt demo on the HOST (via NFS), the Qt lib now sitting on my TARGET board?
btw, I tried to make directory Qtlib and then copy the entire Qt lib from my HOST PC into my TARGET BOARD (/Qtlib):
cp -r /mnt/QtEmbedded-4.8.6-arm/lib /lib/Qtlib
However, when I tried to change my PATH on my TARGET BOARD, i'm unable to save the file in vi editor.
At this juncture, I tried to create a mkdir 'test' on root to test out i.e. mkdir /home/test and was returned with the following error:
/ # mkdir /home/aa
mkdir: can't create directory '/home/aa': Cannot allocate memory
I tried to reboot embedded Linux but still unable to edit and save changes in my profile using vi editor.
My memory at that juncture is
Total = 119MB
Used = 35 MB
Free = 83 MB
For /etc/profile you need root access. So first call su and then start vi.
Linux is not Windows, PATH is only used to find executable not libraries.
You can use
@jsulm it seems that my su command is not functional; when I use the command, it'll just go from my root to /~. Nonetheless, when I execute vi, I don't need root access when I type [vi profile]
@SGaist Tkx, I've amended and appended LD_LIBRARY_PATH="/mnt/QtEmbedded-4.8.6-arm/lib" to my profile file in /etc/profile but i'm still having the same problem when running framebuffer - unable to find libQtGui.so.4.
Could it be during cross-compilation, I could have missed out any variables when performing [Make] command?
Were did you modify these variables ?
I didn't modify any source code variables though, I just did a ./configure, followed by make and make install that installs Qt-everywhere-opensource-4.8.6 into my /local/Trolltech folder
btw, i'm looking at qt-everywhere-enterprise-5.7 sources and what does it mean by 'sysroot'? Where may I locate my sysroot path?
@embdev sysroot is the file-system (or part of it) of your target device. You can mount it wherever you want (or just copy it to a location). You need the sysroot to be able to cross-compile for your target as it contains all the libs and header files.
I compiled the qt-everywhere-enterprise-4.8.6 sources with static libraries and tried to run on my embedded Linux but have a new error:
QScreenLinuxFb::connect:No such file or directory.
Error opening framebuffer device /dev/fb0
There's a framebuffer stack on my embedded Linux that came with the vendor's SDK, which i'd need to run in the background
i.e. ./hifb &
However once I returned to command prompt and tried running Qt demo e.g. ./deform -qws, I've the errors as mentioned above .
Do you've any advice on how to bypass / resolve this error so I can at least display Qt demo on my embedded board?
Is there somewhere we can take a look at this SDK ?
The SDK is not readily available though; but I've checked from some other forums saying that I'd need to run the vendor's framebuffer in the background, before I can run the Qt demos successfully:
From my Putty terminal, the following command is executed to keep the vendor's framebuffer running the background:
However, after executing the command line above, i'm unable to start the .exe file in the background and was returned with the following error line:
(fyi, there're a few options after executing sample_hifb in normal mode, i.e. ./sample_hifb so I selected the option '0' as show below:)
-sh: 0: not found
+ Stopped (tty input) ./sample_hifb
Essentially, it seems that this exe file sample_hifb is unable to run in the background.
From this error line, what do you think is missing?
Not sure I understand you correctly. Is this what happens:
./sample_hifb & -sh: 0: not found + Stopped (tty input) ./sample_hifb
Is sample_hifb located in the directory you are in when you try to start it? If not then you have to provide the whole path.
What do you mean by "so I selected the option '0' as show below"? How did you select option 0? Can you post what exactly you entered in the terminal?
hmm somehow I managed to resolve it. I modified the hifb framebuffer source code to pause after initializing the framebuffer, then I execute ./sample_hifb & to run it in the background. After which I went to access and execute my qt demos and basically they're running off my target (embedded) board already.
One thing you could maybe do is to integrate the code that initializes the frame buffer part in your Qt application so you'll have a standalone application.
Thanks for your advice! I guess i'll have to note down the portion of the vendor's framebuffer initialization code that I need next time!