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

 

 

 

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