1. 说明
硬件环境:
迅为imx6q开发板, ARM Cortex-A9的处理器
7.0寸电容触摸屏
软件环境:
使用的是迅为官方提供的u-boot.imx , uImage, Qt5.7的rootfs根文件系统
问题:
在使用迅为提供的Qt5.7的系统时,发现板子的动态库不支持c++ 的东西,只支持Qt,于是就开始了找原因的过程。
下面是在迅为提供的Qt5.7的系统上执行c++的报错问题:
找不到动态库 GLIBCXX_3.4.11
通过执行 strings /lib/libstdc++.so.6 |grep GLIBCXX 后:
发现确实找不到 GLIBCXX_3.4.11。 于是从网上下载了比较新的 libstdc++.so.6.0.17 库,下载链接如下:
https://download.csdn.net/download/nangui/5192279
然后执行如下步骤:
- 将 libstdc++.so.6.0.17拷贝到开发板 /lib/ 目录下
- 删除原来的libstdc++.so.6, 执行 rm -rf libstdc++.so.6
- 建立新的指向libstdc++.so.6.0.17的软链接, 即:
ln -s libstdc++.so.6.0.17 libstdc++.so.6
至此,板子的环境问题就全部解决
2. 板子测试一个c++11的多线程的Demo
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
//#include <iostream>
#include <thread>
void led_proc1();
void led_proc2();
#define MAX 100
int main(void)
{
std::thread t1(led_proc1);
std::thread t2(led_proc2);
t1.join();
t2.join();
//std::cout << "thread john finish" << std::endl;
printf("thread john finish");
return 0;
}
void led_proc1()
{
int fd,LedOnOffTimes;
char gpio[MAX],cmd[MAX];
char *leds = "/dev/leds_ctl";
LedOnOffTimes = MAX;
printf("leds light on and off 5 times \r\n");
if((fd = open(leds, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open %s failed\n",leds);
else
{
printf("open %s success\r\n",leds);
while(LedOnOffTimes--)
{
printf("ioctl leds %d times\n",LedOnOffTimes);
ioctl(fd,0,0); //parameter 2 is cmd ,cmd = 1 leds on
//ioctl(fd,0,1);
sleep(1);
ioctl(fd,1,0);
//ioctl(fd,1,1);
sleep(1);
}
}
close(fd);
}
void led_proc2()
{
int temp = 100;
while(1)
{
//std::cout << "temp= " << temp-- << std::endl;
printf("temp= %d\r\n",temp--);
sleep(2);
}
}
交叉编译命令如下:(注意,编译c++的编译器版本务必在4.8以上才支持)
arm-none-linux-gnueabi-g++ -lpthread led_cpp_thread.cpp -o ledThread3 -std=c++11
其中,因为用到了多线程,因此要加上 -lpthread 命令
用到c++11, 要用到 -std=c++11 命令