在 imx6q 的ARM板上运行c++11的代码

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 命令

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章